Python Chương trình hoán đổi hai số mà không sử dụng biến thứ ba.

⚡ Tóm tắt thông minh

Trao đổiping Hai số không có biến thứ ba hoán đổi giá trị của chúng bằng phép cộng và phép trừ số học.traction, toán tử XOR bitwise, hoặc các thủ thuật số học bitwise. Python Cũng có thể hoán đổi trực tiếp với việc giải nén tuple.

  • 🔘 Phương pháp cổ điển: Phương pháp hoán đổi thông thường chỉ lưu giữ một giá trị trong một biến tạm thời, điều mà các kỹ thuật này tránh được.
  • Hoán đổi số học: Hoán đổi giá trị với a = a + b, sau đó b = a − b, rồi a = a − b.
  • 🔀 Hoán đổi XOR: Áp dụng toán tử XOR bitwise ba lần để hoán đổi các số nguyên mà không gây tràn số.
  • 🧮 Phép toán bitwise: Sử dụng các toán tử AND, OR và toán tử bổ sung để tái tạo phép cộng và phép trừ.tracsự.
  • 🐍 Python đường tắt: Thao tác giải nén tuple, ví dụ: a, b = b, a, hoán đổi hai giá trị bất kỳ trong cùng một dòng.
  • 🤖 Trí tuệ nhân tạo và dữ liệu: Hoán đổi bộ dữ liệu và lập chỉ mục NumPy sắp xếp lại các phần tử mảng trong quá trình chuẩn bị cho học máy.

Hoán đổi hai Numbers Không sử dụng biến số thứ ba

Các phần bên dưới đề cập đến bốn cách hoán đổi mà không cần biến tạm thời, cộng với lỗi tràn số học.

Trong ngôn ngữ lập trình, hoán đổiping Hoán đổi nghĩa là trao đổi giá trị của hai biến. Biến đó có thể chứa số, chuỗi, danh sách hoặc mảng, đối tượng, v.v. Cách hoán đổi thông thường là...ping Đó là sử dụng một biến tạm thời để lưu trữ các giá trị. Ví dụ:

Hoán đổi hai Numbers

Các bước chung của việc trao đổiping Hai số đó là:

  • Khai báo một biến tạm thời C
  • Gán giá trị của A cho C, nghĩa là C = A. Bây giờ C = 20
  • Gán giá trị của B cho A nên A = 30
  • Gán giá trị của C cho B, Vậy B = 20, vì C có giá trị 20.

Đây là cách hoán đổiping Việc này được thực hiện với sự trợ giúp của một biến tạm thời, và nó hoạt động cho cả số nguyên và số thực.

Hoán đổi bằng phương trình số học

Như chúng ta đã biết, trao đổiping Hoán đổi nghĩa là trao đổi nội dung của hai đối tượng, trường hoặc biến. Hoán đổi bằng phép toán số học nghĩa là thực hiện việc hoán đổi bằng một phương trình toán học, ví dụ như phép cộng và phép trừ.tracsự.

Nếu cho hai số và yêu cầu hoán đổi vị trí của chúng mà không sử dụng biến tạm thời, thì bằng cách sử dụng ba phép toán số học, ta có thể hoán đổi được hai số đó.

Mã giả cho thao tác hoán đổiping số bằng cách sử dụng phép toán số học:

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

Giả sử chúng ta có hai số, A = 20 và B = 30.

Điều kiện 1: A = A+B

Vậy, giá trị hiện tại của A là 20 + 30 = 50.

Điều kiện 2: B = AB

Bây giờ, B = 50-30 = 20
Ta có thể thấy rằng ta đã tìm được giá trị của A trong B.

Điều kiện 3: A = AB

Cuối cùng, A = 50-20 = 30
A có giá trị ban đầu là B.

Vì vậy, chúng tôi chỉ trao đổi số.

Đây là chương trình để hoán đổi hai số trong ngôn ngữ 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);
}

Đầu ra:

Enter value of A: 20
Enter value of B: 30
A = 20 , B = 30
Now, A = 30 , B = 20

Chương trình trong 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))

Đầu ra:

Enter value of A: 20
Enter value of B: 30
A = 20 , B = 30
Now, A = 30 , B = 20

Bây giờ trong PythonChúng ta thậm chí không cần thực hiện các phép toán số học. Chúng ta có thể sử dụng:

a,b = b,a

Đây là một ví dụ minh họa với a=20, b=30;

Hoán đổi bằng phương trình số học

Hoán đổi bằng cách sử dụng Bitwise XOR Operator

Phương pháp này còn được gọi là hoán đổi XOR. XOR có nghĩa là phép toán OR độc quyền. Chúng ta lấy hai bit làm đầu vào cho phép toán XOR trong phép toán bitwise này. Để nhận được một đầu ra từ phép toán XOR, chỉ cần một trong hai đầu vào là 1. Nếu không, đầu ra sẽ là 0. Bảng sau đây hiển thị đầu ra cho tất cả các tổ hợp đầu vào A và B.

Chúng ta cần biết phép toán XOR hoạt động như thế nào để hoán đổi hai số bằng phép toán bitwise. Dưới đây là bảng XOR, trong đó A và B là các giá trị đầu vào.

A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

Nếu hai đầu vào có cùng giá trị, phép toán XOR cho kết quả là 0; ngược lại, là 1. Trong ví dụ này, chúng ta sẽ sử dụng phép toán XOR 3. Trong hầu hết các ngôn ngữ lập trình, phép toán XOR được ký hiệu là “^”.

Giả sử A=4 (trong hệ nhị phân = 0100) và B=7 (trong hệ nhị phân, 0111)

Điều kiện 1: A = A^B

A 0 1 0 0
B 0 1 1 1
A ^ B 0 0 1 1

Bây giờ, A = 0011 (ở dạng nhị phân).

Điều kiện 2: B = A^B

A 0 0 1 1
B 0 1 1 1
A ^ B 0 1 0 0

Vì vậy B = 0100, là giá trị nhị phân ban đầu của A.

Điều kiện 3: A = A^B

A 0 0 1 1
B 0 1 0 0
A ^ B 0 1 1 1

Cuối cùng, A = 0111, là giá trị nhị phân tương đương của B.

Chương trình bằng 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);
}

Đầu ra:

Enter value of A:4
Enter value of B:7
A=4, B=7
Now, A=7, B=4.

Chương trình trong 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))

Đầu ra:

Enter the value of A:10
Enter the value of B:15
A=10 and B=15
Now, A=15,B=10.

Trao đổi Numbers sử dụng Bitwise-Arithmetic

Phương pháp này tương tự như phương pháp số học, nhưng chúng ta sẽ sử dụng các phép toán bitwise như AND, OR và phép bù để thực hiện phép cộng và phép trừ.tracTrước khi đi vào các bước, chúng ta hãy cùng xem qua nhanh khái niệm “bổ sung”.

Phép bù 1 có nghĩa là đổi tất cả các số 0 thành 1 và 1 thành 0. Chúng ta hãy xem một ví dụ.

  • Giả sử số 23 là một số thập phân.
  • Chuyển đổi sang hệ nhị phân ta được 10111. Hệ nhị phân chỉ có 5 bit, nhưng máy tính lưu trữ số theo 8, 16, 32, 64… bit. Vì vậy, ta hãy thêm số 0 vào trước số nhị phân. Việc này sẽ không làm thay đổi giá trị ban đầu của số. Vậy nó sẽ trở thành 00010111.
  • Như chúng ta đã biết, phép bù 1 có nghĩa là đổi tất cả các số 0 thành 1 và 1 thành 0, vì vậy thực hiện phép bù 1 trên 00010111 cho 11101000.

Trong hầu hết các ngôn ngữ lập trình, phần bù 1 được biểu diễn bằng ký hiệu “~”. Đặt ký hiệu này trước bất kỳ giá trị số nguyên hoặc số thực nào sẽ cho ra phần bù 1.

Và số bù 2 có nghĩa là thêm số nhị phân “1” vào số bù 1. Nếu chúng ta thực hiện phép cộng 2 cho số trên:

  • Nhị phân = 00010111
  • Phần bù của 1 = 11101000
  • Phần bù của 2:

11101000

+ 1

11101001

Vì vậy, số bù 2 là 11101001. Đây là Hệ nhị phân cho -23.
Tóm lại, để thực hiện phép cộng 2 của số A, nó sẽ như sau:

Phần bù 2 của A = (~A) + 1

Bây giờ, giả sử A=8 (nhị phân 00001000), B=10 (00001010)

Điều kiện 1: A = (A & B) + (A | B)

Nó tương đương với A = A + B.

A & B = 00001000 & 00001010 = 00001000

A | B = 00001000 | 00001010 = 00001010

Bây giờ, 00001000 + 00001010 = 00010010 (thập phân 18)

Vì vậy, A = 18

Điều kiện 2: B = A + (~B) + 1

Điều này tương đương với B = AB

Ở đây, B = A – B

Từ những thảo luận trên, nếu chúng ta cần thực hiện phép toán contracĐể thực hiện phép tính này, ta lấy phần bù 2 của số âm rồi cộng vào.

Vì vậy, -B = ~B + 1

Bây giờ, B = 00010010 + (11110101) + 1 = 00001000

Giá trị của B tương đương với số thập phân 8, là giá trị ban đầu.

Điều kiện 3: A = A + (~B) + 1

Điều này tương đương với A = AB

Bây giờ, A = 00010010 + 11110111 + 1

A = 00001010 (tương đương với số thập phân 10)

Cuối cùng, A nhận được giá trị của B. Như vậy, giao dịch hoán đổi đã hoàn tất.ping đã hoàn thành.

Chương trình bằng 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);
}

Đầu ra:

Enter the value of A: 8
Enter the value of B:10
A=8, B=10
Now, A=10, B=8

Chương trình trong 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))

Đầu ra:

Enter the value of A: 25
Enter the value of B: 25
A = 25 and B = 25
Now, A = 25 and B = 25

Tràn số học là gì?

Thuật ngữ "tràn" (overflow) có nghĩa là vượt quá giới hạn. Tràn số học (arithmetic overflow) có nghĩa là kết quả của bất kỳ phép toán số học nào vượt quá phạm vi hoặc giới hạn của cách biểu diễn số trong kiến ​​trúc máy tính. Ví dụ, nếu một số được chia cho 0, nó sẽ trở thành vô cực, và hệ thống số của máy tính không thể chứa nó trong 32 hoặc 64 bit.

Biểu diễn số nguyên

Biểu diễn số nguyên trong hệ thống 32 bit

Hậu quả của việc tràn số học có thể là:

  • Phép cộng hai số dương sẽ cho kết quả âm, vì bit dấu có thể trở thành 1, tức là một số âm.
  • Phép cộng hai số âm sẽ cho kết quả dương, vì bit dấu có thể trở thành 0, tức là một số dương.

Câu Hỏi Thường Gặp

hoán đổi XORping Phương án được ưa thích trong các cuộc phỏng vấn là: không cần thêm bộ nhớ, không bị tràn. Phép toán số học là một phương án dự phòng khá tốt, và Python Các nhà phát triển thường chỉ viết a, b = b, a.

Không. Phép toán XOR bitwise chỉ hoạt động trên các mẫu bit số nguyên, không hoạt động trên số thực, số double hoặc con trỏ. Đối với số thực, hãy sử dụng giải nén tuple hoặc hoán đổi số học thay thế.

Nếu cả hai biến cùng chia sẻ một vị trí bộ nhớ, hãy thực hiện phép hoán đổi XOR.ping Đặt giá trị về 0. Thêm điều kiện kiểm tra if bất cứ khi nào có thể xảy ra việc tạo bí danh.

Đúng vậy: a = a * b, b = a / b, a = a / b. Nhưng nó sẽ không hoạt động khi một trong hai giá trị bằng 0 và mất độ chính xác của số thực.

Chỉ có thao tác giải nén tuple mới làm được điều đó. Viết a, b = b, a sẽ hoán đổi chuỗi, danh sách hoặc đối tượng. Các thủ thuật số học và XOR chỉ áp dụng cho số nguyên.

Hầu như không. Các trình biên dịch hiện đại đã tối ưu hóa việc hoán đổi biến tạm thời, vì vậy thủ thuật này hiếm khi cải thiện tốc độ. Readable Việc lưu trữ mã nguồn quan trọng hơn việc chỉ lưu một biến.

Đúng vậy. Mã máy học hoán đổi các giá trị với Python giải nén tuple và numpy Việc lập chỉ mục như arr[[i, j]] = arr[[j, i]] sẽ hoán đổi các hàng của mảng tại chỗ.

Đúng vậy. GitHub Copilot và các trợ lý AI tương tự có thể thực hiện các phép toán XOR, phép toán số học và hoán đổi mở rộng bộ dữ liệu từ một lời nhắc. RevXem xét từng trường hợp để tìm lỗi tràn bộ nhớ và lỗi răng cưa.

Tóm tắt bài viết này với: