题目

读入两个整数,分别用(1)临时变量、(2)不用第三个变量两种方式交换后输出。

思路

临时变量法:t=a; a=b; b=t;。无第三变量可写加减法或异或交换(两法各写一段或两个程序视题面要求);输出交换后的 ab 验证。

解题分析

交换两值本质是保存其中一个,再把另一个写回去。临时变量最直观,也适用于浮点和任意类型。不用第三个变量时,加减法和异或都在整数范围内常用,但要先看会不会溢出、是不是同一块内存。

  • 临时变量:无溢出顾虑,可读性最好,实际工程里优先用它。
  • 加减法:仅当两数之和(差)在类型范围内才安全,浮点别用。
  • 异或:要求整型且 xy 不是同一地址;逻辑清楚,面试里爱问。

完整程序

#include <stdio.h>

static void swap_temp(int *x, int *y)
{
    int t = *x;
    *x = *y;
    *y = t;
}

static void swap_xor(int *x, int *y)
{
    *x ^= *y;
    *y ^= *x;
    *x ^= *y;
}

int main(void)
{
    int a, b;
    if (scanf("%d %d", &a, &b) != 2) {
        return 1;
    }
    printf("原值: %d %d\n", a, b);

    swap_temp(&a, &b);
    printf("临时变量交换后: %d %d\n", a, b);

    swap_xor(&a, &b);
    printf("异或交换后: %d %d\n", a, b);

    return 0;
}

运行示例

输入:

3 7

输出:

原值: 3 7
临时变量交换后: 7 3
异或交换后: 3 7

其它写法

下面每种写法都是完整程序,输入输出格式与正文一致,便于对照。

加减法交换

仅当 a+b 与 a-b 在 int 范围内时使用,与正文异或写法对照。

程序:

#include <stdio.h>

int main(void)
{
    int a, b;
    if (scanf("%d %d", &a, &b) != 2) {
        return 1;
    }
    printf("原值: %d %d\n", a, b);
    a = a + b;
    b = a - b;
    a = a - b;
    printf("加减法交换后: %d %d\n", a, b);
    return 0;
}

运行示例

输入:

3 7

输出:

原值: 3 7
加减法交换后: 7 3