不使用第三个变量交换两个数字:C、Python 程序
在编程中,交换语言是指交换两个变量的值。变量可能包含数字、字符串、列表或数组、对象等。交换的一般方法是使用临时变量来保存值。例如,
交换两个数字的一般步骤是
- 声明一个临时变量 C
- 将 A 的值赋给 C,表示 C = A。现在 C = 20
- 将 B 的值赋给 A,所以 A = 30
- 将 C 的值赋给 B,所以 B = 20,因为 C 有值 20。
这就是借助临时变量进行交换的方法。此方法既适用于整数也适用于浮点数。
使用算术方程进行交换
我们知道,交换是指互换两个对象、字段或变量的内容。通过算术运算进行交换是指使用数学方程,即加法和减法来执行交换操作。
如果我们给出两个数字,要求在不使用临时变量的情况下进行交换,那么通过三个算术方程,我们可以交换这些数字。
使用算术运算交换数字的伪代码
A = A + B B = A - B A = A - B
假设我们有两个数字,A = 20 和 B = 30。
条件 1: A = A+B
所以,A 的当前值为 20+30 = 50
条件 2: B = A-B
现在,B = 50-30 = 20
我们可以看到我们得到了 B 中的 A 的值
条件 3: A = A-B
最后,A = 50-20 = 30
A 具有 B 的初始值。
这样,我们就交换了数字。
这是用 C/C++ 交换两个数字的程序
#include<stdio.h> int main() { int a, b; printf("Enter value of A: "); scanf("%d", & a); printf("Enter value of B: "); scanf("%d", & b); printf("A = %d, B = %d", a, b); a = a + b; b = a - b; a = a - b; printf("\nNow, A = %d, B = %d", a, b); }
输出
Enter value of A: 20 Enter value of B: 30 A = 20 , B = 30 Now, A = 30 , B = 20
Python 程序
a = int(input("Enter value of A: ")) b = int(input("Enter value of B: ")) print("A = {} and B = {}".format(a, b)) a = a + b b = a - b a = a - b print("Now, A = {} and B = {}".format(a, b))
输出
Enter value of A: 20 Enter value of B: 30 A = 20 , B = 30 Now, A = 30 , B = 20
现在在 Python 中,我们甚至不需要执行算术运算。我们可以使用
a,b = b,a
这是一个演示,其中 a=20, b=30;
使用按位 XOR 运算符进行交换
此方法也称为 XOR 交换。XOR 表示异或。在此按位运算中,我们将两个位作为输入提供给 XOR。要从 XOR 获得一个输出,只有一个输入必须为 1。否则,输出将为 0。下表显示了所有输入组合 A B 的输出。
我们需要了解 XOR 操作如何工作才能使用按位操作交换两个数字。下面是 XOR 的表,其中 A 和 B 是输入值。
A | B | A XOR B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
如果两个输入具有相同的值,则 XOR 操作给出 0;否则,给出 1。对于此示例,我们将使用 3 次 XOR 操作。在大多数编程语言中,XOR 表示为“^”。
假设 A=4(二进制 = 0100)和 B=7(二进制,0111)
条件 1: A = A ^ B
A | 0 | 1 | 0 | 0 |
B | 0 | 1 | 1 | 1 |
A ^ B | 0 | 0 | 1 | 1 |
现在,A = 0011(二进制)。
条件 2: B = A^B
A | 0 | 0 | 1 | 1 |
B | 0 | 1 | 1 | 1 |
A ^ B | 0 | 1 | 0 | 0 |
所以 B = 0100,这是 A 的初始二进制值。
条件 3: A = A^B
A | 0 | 0 | 1 | 1 |
B | 0 | 1 | 0 | 0 |
A ^ B | 0 | 1 | 1 | 1 |
最后,A = 0111,这是 B 的等效二进制值。
C/C++ 程序
#include<stdio.h> int main() { int a, b; printf("Enter value of A: "); scanf("%d", & a); printf("Enter value of B: "); scanf("%d", & b); printf("A = %d, B = %d", a, b); a = a ^ b; b = a ^ b; a = a ^ b; printf("\nNow, A = %d, B = %d", a, b); }
输出
Enter value of A:4 Enter value of B:7 A=4, B=7 Now, A=7, B=4.
Python 程序
a = int(input("Enter value of A: ")) b = int(input("Enter value of B: ")) print("A = {} and B = {}".format(a, b)) a = a ^ b b = a ^ b a = a ^ b print("Now, A = {} and B = {}".format(a, b))
输出
Enter the value of A:10 Enter the value of B:15 A=10 and B=15 Now, A=15,B=10.
使用按位-算术交换数字
此方法与算术方法相同,但我们将使用按位操作(如 AND、OR 和补码)来执行加法和减法。在进行步骤之前,让我们快速回顾一下“补码”。
1 的补码是指将所有 0 变为 1,将所有 1 变为 0。例如。
- 假设数字 23,一个十进制数字。
- 转换为二进制是 10111。只有 5 位,但计算机以 8、16、32、64 位存储数字。所以让我们在二进制前面加零。这不会改变数字的原始值。所以它将变成 **00010111**。
- 我们知道,1 的补码是指将所有 0 变为 1,将所有 1 变为 0,所以对 **00010111** 执行 1 的补码得到 **11101000**。
这个 1 的补码在大多数编程语言中用“~”符号表示。在任何整数或浮点值前放置此符号将得到 1 的补码。
而 2 的补码是指在 1 的补码上加二进制“1”。如果我们对上面的数字进行 2 的补码
- 二进制 = 00010111
- 1 的补码 = 11101000
- 2 的补码
11101000
+ 1
11101001
所以,2 的补码是 11101001。这是 -23 的二进制。
总而言之,要对数字 A 执行 2 的补码,它将看起来像
A 的 2 的补码 = (~A) + 1
现在让我们假设 A=8(二进制 00001000),B=10(00001010)
条件 1: A = (A & B) + (A | B)
它等同于 A = A + B。
A & B = 00001000 & 00001010 = 00001000
A | B = 00001000 | 00001010 = 00001010
现在,00001000 + 00001010 = 00010010(十进制 18)
所以,A = 18
条件 2: B = A + (~B) + 1
它等同于 B = A-B
这里,B = A – B
从上面的讨论可以看出,如果我们想执行减法,我们对负数进行 2 的补码,然后将其相加。
所以,-B = ~B + 1
现在, B = 00010010 + (11110101) + 1 = 00001000
B 的值等同于十进制 8,这是初始值。
条件 3: A = A + (~B) + 1
它等同于 A = A-B
现在,A = 00010010 + 11110111 + 1
A = 00001010(等同于十进制 10)
最后,A 获得了 B 的值。因此,交换完成。
C/C++ 程序
#include<stdio.h> int main() { int a, b; printf("Enter value of A: "); scanf("%d", & a); printf("Enter value of B: "); scanf("%d", & b); printf("A = %d, B = %d", a, b); a = (a & b) + (a | b); b = a + ~b + 1; a = a + ~b + 1; printf("\nNow, A = %d, B = %d", a, b); }
输出
Enter the value of A: 8 Enter the value of B:10 A=8, B=10 Now, A=10, B=8
Python 程序
a = int(input("Enter value of A: ")) b = int(input("Enter value of B: ")) print("A = {} and B = {}".format(a, b)) a = (a & b) + (a | b) b = a + ~b + 1 a = a + ~b + 1 print("Now, A = {} and B = {}".format(a, b))
输出
Enter the value of A: 25 Enter the value of B: 25 A = 25 and B = 25 Now, A = 25 and B = 25
什么是算术溢出?
溢出(overflow)一词表示超出限制。算术溢出是指任何算术运算的结果超出了计算机体系结构的数字表示的范围或限制。例如,如果一个数字除以零,它将变成无穷大,计算机数字系统无法将其容纳在 32 位或 64 位中。
算术溢出的后果可能包括
- 两个正数相加变成负数。因为符号位可能变为 1,表示一个负数。
- 两个负数相加变成正数。因为符号位可能变为 0,表示一个正数。