题目

读入两个整数,分别用(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