题目
读入两个整数,分别用(1)临时变量、(2)不用第三个变量两种方式交换后输出。
输入格式:一行输入两个整数 a 和 b,以空格分隔。
输出格式:分别输出原值、临时变量交换后的值、异或交换后的值。
数据范围与约定:-109 ≤ a, b ≤ 109。
思路与算法
1. 临时变量交换(工程首选)
借助第三个变量 t = *x; *x = *y; *y = t;。优点是语义清晰直观、支持任意数据类型,无溢出与别名风险,实际开发中推荐使用。
2. 异或位运算交换
利用异或性质 x ^ x = 0 以及 x ^ 0 = x,连续三次异或即可在无额外空间下交换两数:*x ^= *y; *y ^= *x; *x ^= *y;。
陷阱提醒:若指针 x 与 y 指向同一内存地址(自交换),第一次异或后该地址的值会被强制清零,因此异或法不可用于自交换。
3. 指针传参修改实参
Java 语言函数参数均为值传递,要在函数内部改变外部变量的值,必须传递变量的内存地址(指针),通过解引用 *x 操作目标值。
完整程序
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println("原值: " + a + " " + b);
// 方式一:临时变量法(直观通用,无溢出风险)
int t = a;
a = b;
b = t;
System.out.println("临时变量交换后: " + a + " " + b);
// 方式二:异或运算法(利用 a ^ a = 0 与 a ^ 0 = a 性质)
a ^= b;
b ^= a;
a ^= b;
System.out.println("异或交换后: " + a + " " + b);
}
}运行示例
输入:
3 7输出:
原值: 3 7
临时变量交换后: 7 3
异或交换后: 3 7