Поміняйте місцями два числа без використання третьої змінної: 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 = A+B

                  Отже, поточне значення А дорівнює 20+30 = 50

Умова 2:    B = AB

                   Тепер B = 50-30 = 20
                   Ми бачимо, що ми отримали значення A у B

Умова 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;

Поміняти місцями за допомогою арифметичного рівняння

Поміняти місцями за допомогою побітового XOR Operaтор

Цей метод також відомий як обмін 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
А ^ Б 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 за допомогою побітової арифметики

Цей метод такий самий, як і арифметичний метод, але ми будемо використовувати порозрядні операції, такі як І, АБО та комплімент, щоб виконувати додавання та віднімання. Перш ніж переходити до кроків, давайте швидко переглянемо «Комплімент».

Доповнення до 1 означає заміну всіх 0 на 1 і 1 на 0. Наведемо приклад.

  • Давайте припустимо число 23, десяткове число.
  • Перетворення на двійковий дає змогу використовувати 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) + (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

З наведеного вище обговорення, якщо нам потрібно виконати віднімання, ми виконуємо доповнення 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. Таким чином, заміна завершена.

Програма на 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, що означає додатне число.