Đổi chỗ hai số mà không sử dụng biến thứ ba: C, Python chương trình

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

Hoán đổi hai Numbers

Các bước chung để hoán đổi 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.

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

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

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

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

Mã giả để hoán đổi số bằ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
                   Chúng ta có thể thấy rằng chúng ta đã nhận đượ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 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 Python, chúng ta thậm chí không cần thực hiện các phép tính số học. Chúng ta có thể sử dụng:

a,b = b,a

Đây là minh họa trong đó 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ũng được gọi là XOR swap. XOR có nghĩa là OR loại trừ. Chúng ta lấy hai bit làm đầu vào cho XOR trong phép toán bitwise này. Để có một đầu ra từ XOR, chỉ một đầu vào phải 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 kết hợp đầu vào A B.

Chúng ta cần biết cách hoạt động của phép toán XOR để hoán đổi hai số bằng phép toán bitwise. Sau đâ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ị, thì phép toán XOR cho kết quả là 0; nếu không, thì là 1. Đối với 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, XOR được ký hiệu là “^”.

Giả sử A=4 (ở dạng nhị phân = 0100) và B=7(ở dạng 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 giống 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à Compliment để thực hiện phép cộng và phép trừ. Trước khi đi vào các bước, chúng ta hãy xem qua “Compliment” một cách nhanh chóng.

Phần bù 1 có nghĩa là thay đổi tất cả 0 thành 1 và 1 thành 0. Hãy xem một ví dụ.

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

Số bù 1 này được biểu thị bằng ký hiệu “~” này trong hầu hết các ngôn ngữ lập trình. Đặt ký hiệu này trước bất kỳ giá trị số nguyên hoặc giá trị dấu phẩy động nào sẽ cho 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
  • Lời khen của 1 người = 11101000
  • Lời khen 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ờ hãy 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

                   Tương đương với B = AB

Ở đây, B = A – B

Từ phần thảo luận ở trên, nếu chúng ta cần thực hiện phép trừ, chúng ta thực hiện phép trừ 2 cho số âm rồi cộng nó.

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

                   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, việc hoán đổi đã hoàn tất.

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 có nghĩa là vượt quá giới hạn. Tràn số học có nghĩa là kết quả của bất kỳ phép tính số học nào vượt quá phạm vi hoặc giới hạn biểu diễn số của kiến ​​trúc máy tính. Ví dụ, nếu một số được chia cho số không, nó sẽ trở thành vô hạn và hệ thống số máy tính không thể giữ 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 trở thành số âm. Bởi vì bit dấu có thể trở thành 1, nghĩa là số âm.
  • Phép cộng hai số âm trở thành số dương. Bởi vì bit dấu có thể trở thành 0, nghĩa là số dương.