题目描述
题目链接:编写函数实现两数交换(指针方式)
描述
编写一个函数,实现两个整数的交换,要求采用指针的方式实现。
输入描述:
键盘输入2个整数 m 和 n
输出描述:
输出交换后m 和 n 的值,中间使用空格隔开
示例1
输入:2
3
输出:3 2
解题分析:
这道题使用函数实现交换功能,考察的是传址调用。有三种解题方法:
思路1:利用临时变量。
思路3:不使用临时变量,利用加减运算符。
思路2:不使用临时变量,利用按位异或运算符。
异或运算规则:0 ^ a = a,a ^ a = 0,a ^ b ^ a = b,a ^ b ^ b = a
代码实现:
方法1
#include <stdio.h>
void swap(int* x,int* y)
{
//有临时变量
int tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int m = 0, n = 0;
scanf("%d", &m);
scanf("%d", &n);
swap(&m,&n);
printf("%d %d",m,n);
return 0;
}
方法2
#include <stdio.h>
void swap(int* x,int* y)
{
//无临时变量
*x = *x + *y;//m = 8,n = 5
*y = *x - *y;//n = 3,m = 8
*x = *x - *y;//m = 5,n = 3;
//当两个数超级大时,相加的结果可能会有溢出
}
int main()
{
int m = 0, n = 0;
scanf("%d", &m);//m = 3
scanf("%d", &n);//n = 5
swap(&m,&n);
printf("%d %d",m,n);
return 0;
}
方法3
#include <stdio.h>
void swap(int* x,int* y)
{
//异或方法,兼容了以上两种,无临时变量,且不会结果溢出
//a ^ b ^ b = a,a ^ b ^ a = b
//0 ^ a = a, a ^ a = 0
*x = *x ^ *y;
*y = *x ^ *y;//a ^ b ^ b = a
*x = *x ^ *y;//a ^ b ^ a = b
}
int main()
{
int m = 0, n = 0;
scanf("%d", &m);
scanf("%d", &n);
swap(&m,&n);
printf("%d %d",m,n);
return 0;
}
- 非函数实现
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("before:a = %d,b = %d\n", a, b);
//方法1:有临时变量
int tmp = 0;
tmp = a;
a = b;
b = tmp;
//方法2:无临时变量
a = a + b;//a = 8,b = 5
b = a - b;//b = 3,a = 8
a = a - b;//a = 5,b = 3;
//当两个数超级大时,相加的结果可能会有溢出
//方法3:异或方法,兼容了以上两种
//a ^ b ^ b = a,a ^ b ^ a = b
//0 ^ a = a, a ^ a = 0
a = a ^ b;
b = a ^ b;//a ^ b ^ b = a
a = a ^ b;//a ^ b ^ a = b
printf("after: a = %d,b = %d\n", a, b);
return 0;
}
注意:对于非函数的实现,是主函数内的操作,不需要使用指针操作。