2 zephyr0703 zephyr0703 于 2016.04.30 16:38 提问

C++ 全排序算法中交换两个数

#include<iostream>
using namespace std;

void swap(int& a, int& b){
a = a + b;
b = a - b;
a = a - b;
}

void swap1(int&a, int& b){
int temp = b;
b = a;
a = temp;
}

void perm(int a[], int i, int n){
if(i == n - 1){
for(int k = 0; k < n; k++){
printf("%d ", a[k]);
}
printf("\n");
return;
}
for(int j = i; j < n ; j++){
swap(a[j], a[i]);
printf("%d-%d\n", a[i], a[j]);
perm(a, i+1, n);
swap(a[j], a[i]);
}
}

int main(){
int a[100], n;
scanf("%d", &n);
for(int i = 0; i < n ;i++){
scanf("%d", &a[i]);
}
perm(a, 0, n);
return 0;
}

使用swap函数
输入
3
1 2 3
输出
0 0 3
0 3 0
0 0 3
0 3 0
3 0 0
3 0 0
输出明显是错误的,
但如果我用swap1这个函数来交换,则输出是正确的
求问,这是怎么回事?
我使用的系统是Mac OS, 编译器是clang++( Apple LLVM version 7.3.0)

2个回答

q610098308
q610098308   2016.04.30 17:16

解析一下这几句的意思
a = a + b;
先将两个数的和,放入a;例: a = 1 ,b = 3,执行后 a是原a+b的和;a = 4,b = 3值未变;
b = a - b;
这个是用a-b 差给b;意义是 将b = ('a'+b) -b; 现在 b= 最早a的值;
a = a - b;
这个意思是 ('a'+'b') -a; 将 a = 'b';
进行了值的交换;

实际是不借用第三个数,进行交换;

zephyr0703
zephyr0703 但我用这种方式做全排序,得到的排序是错误的,使用temp局部变量的变换方式能得到正确的结果,我用的编译器是g++
大约 2 年之前 回复
q610098308
q610098308   2016.04.30 17:55

和编译器完全没有关系;
是你写排序有问题:
以下是冒泡排序,你可以对照一下,看你错在哪里:
void bubble_sort(int a[], int n)
{
int i, j, temp;
for (j = 0; j < n - 1; j++)
for (i = 0; i < n - 1 - j; i++)
{
if(a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
算法实现两个数交换(多种方法)
算法实现两个数交换(多种方法)
c语言中不需要中间变量就能实现两个数交换的几种算法
第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种: (1)加减法。 a = a + b; b = a - b; a = a - b; 该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据: a = 3.123456 b = 1234567.000000 交换后各变量值变为: a = 1234567.000000
用c语言编写两个数的交换,三种方法
下面是从函数角度,还有简单的交换 法去实现两个数的交换。其中函数用到指针,通过前两种方法可以深刻的体会到指针变得的含义。 #include void swap(int *a,int *b) {   int temp;     temp=*a;      *a=*b;     *b=temp; }  void main()  {     int x=2, y=5;    
C语言实现交换两个数
C语言中要实现交换两个变量的值可以有很多种方法,下面是我收集的方法:方法一:使用临时变量void exchange(int *a, int *b){ int temp = 0; temp = *a; *b = *a; *a = temp;} 方法二:不使用临时变量void exchange(int *a, int *b){
[c]不用第三个数,去交换二个数的位置。
int a = 10; int b = 20; 第一种方法: a = a + b; b = a - b; a = a - b; 第二种方法: a = a ^ b; b = a ^ b; a = a ^ b; 第三种方法 a = (a + b) - (b = a);
C语言中如何用指针交换两个数的大小
如何用传址的方式交换两个数的大小 首先先看第一个程序,用函数的调用来解决看似正确实则运行出来的结果是错误的 #define _CRT_SECURE_NO_WARNINGS 1 #include #include #include int JH(int x, int y); int main() { int a, b; printf("请输入两个数:\n"); scanf("%d%d",
C语言中交换两个数的方法
问题描述:程序中有两个数a,b,其中a=4,b=5,现在希望交换两个数的值,使得a=5,b=4.在这里我总结了一下目前我已经掌握的C语言中交换两个数的方法,主要如下几种,下面我将分别来进行介绍。方法1: 使用一个临时变量来进行保存,这应该也是大家最容易想到的方法,话不多说,直接上代码。参考代码:#include <stdio.h>int main() { int a = 4; int
C语言交换两个变量数值的几种方法
因为经常见到这类题目,就自己总结了以下几种办法 1. 创建中间变量 这是最快也是最简单的办法,例如: #include&amp;lt;stdio.h&amp;gt; int main() { int a=10; int b=20; int temp; printf(&quot;交换前a,b的值为:\n&quot;); printf(&quot;a=%d\n&quot;,a); prin...
C语言——经典的两个数互换的程序——更好的理解指针!!!
# include<stdio.h> int main(void) { void huhuan(int ,int); void huhuan_1(int *,int *); void huhuan_2(int *,int *); int a=3; int b=5; //huhuan(a,b); //huhuan_1(&a,&b); //huhuan
【C语言】编写一个函数,实现两个数的交换 详细解答
今天在用函数写两数交换的时候发现有点小挫折,然后经过多次查找验证才发现是因为地址不对的缘故,我在此放出两种交换的方法,先发错误的如下:#include &amp;lt;stdio.h&amp;gt; void swap(int a,int b) { int temp=a; a=b; b=temp; } int main() { int a=4,b=5; swap(a,b);...