题目
读入两个整数,分别用(1)临时变量、(2)不用第三个变量两种方式交换后输出。
思路
临时变量法:t=a; a=b; b=t;。无第三变量可写加减法或异或交换(两法各写一段或两个程序视题面要求);输出交换后的 a、b 验证。
解题分析
交换两值本质是保存其中一个,再把另一个写回去。临时变量最直观,也适用于浮点和任意类型。不用第三个变量时,加减法和异或都在整数范围内常用,但要先看会不会溢出、是不是同一块内存。
- 临时变量:无溢出顾虑,可读性最好,实际工程里优先用它。
- 加减法:仅当两数之和(差)在类型范围内才安全,浮点别用。
- 异或:要求整型且
x、y不是同一地址;逻辑清楚,面试里爱问。
完整程序
#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