Python 编写一个程序,在不使用第三个变量的情况下交换两个数字。

⚡ 智能摘要

互换ping 两个没有第三个变量的数通过算术加减运算交换它们的值trac操作、按位异或运算符或按位运算技巧。 Python 也可以直接通过元组解包进行交换。

  • 🔘 传统方法: 通常的交换操作会将一个值保存在临时变量中,而这些技术避免了这种情况。
  • 算术交换: 交换值,先将 a = a + b,然后将 b = a − b,然后将 a = a − b。
  • 🔀 XOR 交换: 三次应用按位异或运算符交换整数,不会发生溢出。
  • 🧮 位运算: 使用 AND、OR 和取反运算符来模拟加法和减法运算trac化。
  • 🐍 Python 捷径: 元组解包,a, b = b, a,交换一行中的任意两个值。
  • 🤖 人工智能和数据: 机器学习准备中的元组交换和 NumPy 索引重新排序数组元素。

交换二 Numbers 不使用第三个变量

以下各节介绍了四种无需临时变量即可进行交换的方法,以及算术溢出问题。

在编程语言中,交换ping 交换两个变量的值。变量可以包含数字、字符串、列表或数组、对象等。交换的一般方法是ping 可以使用临时变量来保存值。例如:

交换二 Numbers

交换的一般步骤ping 这两个数字是:

  • 声明一个临时变量 C
  • 将 A 的值赋给 C,即 C = A。现在 C = 20
  • 将 B 的值赋给 A,所以 A = 30
  • 将 C 的值分配给 B,因此 B = 20,因为 C 的值为 20。

这就是交换的方式ping 这是借助临时变量实现的,并且适用于整数和浮点数。

使用算术方程交换

我们知道,交换ping 交换是指交换两个对象、字段或变量的内容。使用算术运算进行交换是指使用数学等式(例如加法和减法)来执行交换操作。trac化。

如果给定两个数字,要求我们在不使用临时变量的情况下交换这两个数字,那么利用三个算术方程,我们可以交换这两个数字。

交换的伪代码ping 使用算术运算得到的数字:

A = A + B
B = A - B
A = A - B

假设我们有两个数字,A = 20 和 B = 30。

条件1: A=A+B

所以,A 的当前值为 20+30 = 50。

条件2: B = AB

现在,B = 50-30 = 20
我们可以看到,我们在 B 中得到了 A 的值。

条件3: A=AB

最后,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;

使用算术方程交换

使用按位异或交换 Opera器

这种方法也称为异或交换。XOR 表示异或运算。在这个按位运算中,我们使用两个比特作为 XOR 的输入。要使 XOR 运算得到一个输出,必须只有一个输入为 1。否则,输出为 0。下表显示了输入 A 和 B 所有组合的输出。

我们需要了解异或运算的工作原理,即使用位运算交换两个数字。下表列出了异或运算,其中 A 和 B 是输入值。

A B 异或B
0 0 0
0 1 1
1 0 1
1 1 0

如果两个输入值相同,则异或运算结果为 0;否则为 1。本例中,我们将使用 3 个输入的异或运算。在大多数编程语言中,异或运算用“^”表示。

假设 A=4(二进制为 0100),B=7(二进制为 0111)。

条件1: A=A^B

A 0 1 0 0
B 0 1 1 1
艾比 0 0 1 1

现在,A = 0011(二进制)。

条件2: B = A^B

A 0 0 1 1
B 0 1 1 1
艾比 0 1 0 0

所以 B = 0100,这是 A 的初始二进制值。

条件3: A = A^B

A 0 0 1 1
B 0 1 0 0
艾比 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.

互换 Numbers 使用按位算术

这种方法与算术方法相同,但我们将使用按位运算(例如 AND、OR 和取反)来进行加法和减法运算。traction。在介绍步骤之前,让我们快速回顾一下“补语”。

反码是指将所有 0 改为 1,将所有 1 改为 0。我们举个例子。

  • 假设我们取一个十进制数 23。
  • 转换成二进制后得到 10111。虽然只有 5 位,但计算机通常用 8 位、16 位、32 位、64 位……来存储数字。所以我们在二进制数前面加一个零。这不会改变数字的原始值。因此,它将变成 00010111.
  • 我们知道,反码运算是指将所有 0 变为 1,将所有 1 变为 0,因此对 进行反码运算。 0001011111101000.

在大多数编程语言中,反码用“~”符号表示。在任何整数值或浮点值前加上此符号即可得到反码。

而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 = AB

这里,B = A – B

根据以上讨论,如果我们需要执行子程序trac也就是说,我们对负数求 2 的补码,然后加上它。

因此,-B = ~B + 1

现在,B = 00010010 + (11110101) + 1 = 00001000

B的值相当于十进制的8,这是初始值。

条件3: A = A + (~B) + 1

它等价于 A = AB

现在,A = 00010010 + 11110111 + 1

A = 00001010(相当于十进制10)

最终,A得到了B的值。因此,交换成功了。ping 完成了。

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

什么是算术溢出?

溢出是指超出限制。算术溢出是指任何算术运算的结果超出计算机体系结构数字表示的范围或限制。例如,如果一个数除以零,结果将变为无穷大,计算机数字系统无法用 32 位或 64 位来表示它。

整数表示

32 位系统中的整数表示

算术溢出的后果可能是:

  • 两个正数相加的结果为负数,因为符号位可能变为 1,表示负数。
  • 两个负数相加的结果为正数,因为符号位可能变为 0,表示结果为正数。

常见问题

异或交换ping 是面试中最受欢迎的:无需额外内存,不会溢出。算术运算是一个不错的备选方案,而且 Python 开发人员通常只需写 a, b = b, a。

不。按位异或运算仅适用于整数位模式,不适用于浮点数、双精度浮点数或指针。对于浮点数,请改用元组解包或算术交换。

如果两个变量共享一个内存位置,则进行异或交换。ping 将值设置为 0。每当可能使用别名时,添加 if 检查。

是的:a = a * b,b = a / b,a = a / b。但当其中任何一个值为 0 时,计算就会失败,并且会丢失浮点精度。

只有元组解包才能实现这一点。写成 a, b = b, a 会交换字符串、列表或对象。算术运算和异或运算技巧仅适用于整数。

几乎不会。现代编译器已经优化了临时变量的交换,所以这种技巧很少能提高速度。 Readable 代码比保存一个变量更重要。

是的。机器学习代码会交换值。 Python 元组解包,以及 NumPy的 类似 arr[[i, j]] = arr[[j, i]] 的索引会原地交换数组行。

是的。GitHub Copilot 和类似的 AI 助手可以根据提示生成异或运算、算术运算和元组解包交换语句。 Rev逐个检查溢出和别名错误。

总结一下这篇文章: