สลับตัวเลขสองตัวโดยไม่ใช้ตัวแปรที่สาม: C, Python โครงการ

ในการเขียนโปรแกรม การสลับภาษาหมายถึงการสลับค่าของตัวแปรสองตัว ตัวแปรอาจมีตัวเลข สตริง รายการหรืออาร์เรย์ วัตถุ ฯลฯ วิธีการสลับโดยทั่วไปคือการใช้ตัวแปรชั่วคราวเพื่อเก็บค่า ตัวอย่างเช่น,

สลับสอง Numbers

ขั้นตอนทั่วไปในการสลับตัวเลขสองตัวมีดังนี้:

  • ประกาศตัวแปรชั่วคราว 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 คือ 20+30 = 50

เงื่อนไขที่ 2:    บี = เอบี

                   ตอนนี้ B = 50-30 = 20
                   เราเห็นได้ว่าเราได้ค่า A ใน B

เงื่อนไขที่ 3:    ก = เอบี

                   สุดท้าย 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);
}

Output:

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))

Output:

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

ตอนนี้ใน Pythonเราไม่จำเป็นต้องทำการคำนวณทางคณิตศาสตร์ด้วยซ้ำ เราสามารถใช้:

ก,ข = ข,ก

นี่คือการสาธิตโดยที่ a=20, b=30;

สลับโดยใช้สมการเลขคณิต

สลับโดยใช้ Bitwise XOR OperaTor

วิธีนี้เรียกอีกอย่างว่า XOR swap XOR หมายถึง OR แบบเฉพาะ เราใช้บิตสองบิตเป็นอินพุตของ XOR ในการดำเนินการแบบบิตต่อบิตนี้ หากต้องการรับเอาต์พุตหนึ่งรายการจาก XOR อินพุตหนึ่งรายการจะต้องเป็น 1 เท่านั้น มิฉะนั้น เอาต์พุตจะเป็น 0 ตารางต่อไปนี้แสดงเอาต์พุตสำหรับชุดค่าผสมของอินพุต A B ทั้งหมด

เราจำเป็นต้องทราบว่าการดำเนินการ XOR ทำงานอย่างไรในการสลับตัวเลขสองตัวโดยใช้การดำเนินการตามบิต นี่คือตารางสำหรับ XOR โดยที่ A และ B คือค่าอินพุต

A B เอ เอ็กซ์ออร์ บี
0 0 0
0 1 1
1 0 1
1 1 0

หากอินพุตสองตัวมีค่าเท่ากัน การดำเนินการ XOR จะให้ค่าเป็น 0 มิฉะนั้นจะให้ค่าเป็น 1 สำหรับตัวอย่างนี้ เราจะใช้การดำเนินการ XOR 3 ในภาษาการเขียนโปรแกรมส่วนใหญ่ XOR จะแสดงเป็น "^"

สมมติว่า A=4 (ใน Binary = 0100) และ B=7(ใน Binary, 0111)

เงื่อนไขที่ 1:    ก = ก ^ บี

A 0 1 0 0
B 0 1 1 1
เอ ^ บี 0 0 1 1

ตอนนี้ A = 0011 (ในรูปแบบไบนารี)

เงื่อนไขที่ 2:    บี = เอ^บี

A 0 0 1 1
B 0 1 1 1
เอ ^ บี 0 1 0 0

ดังนั้น B = 0100 ซึ่งเป็นค่าไบนารีเริ่มต้นของ A

เงื่อนไขที่ 3:    ก = ก^ข

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);
}

Output:

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))

Output:

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

แลกเปลี่ยน Numbers โดยใช้ Bitwise-Arithmetic

วิธีการนี้เหมือนกับวิธีการทางคณิตศาสตร์ แต่เราจะใช้การดำเนินการตามบิต เช่น AND, OR และ Compliment เพื่อดำเนินการบวกและลบ ก่อนที่จะไปยังขั้นตอนต่างๆ มาดู "Compliment" กันก่อน

ส่วนเสริมของ 1 หมายถึงการเปลี่ยน 0 เป็น 1 และ 1 เป็น 0 ทั้งหมด มาดูตัวอย่างกัน

  • สมมติว่าตัวเลข 23 เป็นเลขทศนิยม
  • การแปลงเป็น Binary ให้ใช้ 10111 มีเพียง 5 บิต แต่คอมพิวเตอร์เก็บตัวเลขไว้ 8,16,32,64 .. บิต ลองบวกศูนย์หน้าไบนารี่กัน จะไม่เปลี่ยนค่าเดิมของตัวเลข มันจึงจะกลายเป็น 00010111.
  • ดังที่เราทราบ คำชมเชยของ 1 หมายถึงการเปลี่ยน 0 เป็น 1 และ 1 เป็น 0 ทั้งหมด ดังนั้นการใช้ส่วนเสริมของ 1 แทน 00010111 จะช่วยให้ 11101000

ส่วนเสริมของ 1 นี้แสดงด้วย “~” สัญลักษณ์นี้ในภาษาโปรแกรมส่วนใหญ่ การใส่สัญลักษณ์นี้หน้าค่าจำนวนเต็มหรือค่าจุดลอยตัวใดๆ จะทำให้เป็นส่วนเสริมของ 1

ส่วนเสริมของ 2 หมายถึงการบวกเลขฐานสอง “1” เข้าไปในส่วนเสริมของ 1 หากเราทำส่วนเสริมของ 2 กับตัวเลขด้านบน:

  • ไบนารี = 00010111
  • คำชมเชย 1 = 11101000
  • คำชมเชยที่ 2:

          11101000

          +1

          11101001

ส่วนเสริมของ 2 คือ 11101001 นี่คือไบนารี่ของ -23
โดยสรุป สำหรับการแสดงส่วนเสริม 2 ของตัวเลข A จะมีลักษณะดังนี้:

ส่วนเสริมของ 2 ของ A = (~A) + 1

ตอนนี้สมมติว่า A=8 (ไบนารี 00001000), B=10(00001010)

เงื่อนไขที่ 1:    ก = (ก & ข) + (ก | ข)

                   มันเทียบเท่ากับ A = A + B

                   เอ และ บี = 00001000 & 00001010 = 00001000

                   ก | บี = 00001000 | 00001010 = 00001010

ตอนนี้ 00001000 + 00001010 = 00010010 (ทศนิยม 18)

ดังนั้น A = 18

เงื่อนไขที่ 2: ข = ก + (~ข) + 1

                   เทียบเท่ากับ B = AB

ในที่นี้ B = A – B

จากการสนทนาข้างต้น หากเราจำเป็นต้องลบ เราจะทำการบวก 2 เข้ากับจำนวนลบแล้วจึงบวกเข้าไป

ดังนั้น -B = ~B + 1

ตอนนี้ B = 00010010 + (11110101) + 1 = 00001000

ค่าของ B เทียบเท่ากับทศนิยม 8 ซึ่งเป็นค่าเริ่มต้น

เงื่อนไขที่ 3: ก = ก + (~B) + 1

                   เทียบเท่ากับ A = AB

ตอนนี้ 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);
}

Output:

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))

Output:

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 ซึ่งหมายถึงจำนวนบวก