Python Програма за размяна на две числа без използване на трета променлива

⚡ Умно обобщение

размянаping Две числа без трета променлива разменят стойностите си на място, използвайки аритметично събиране и извличане.tracция, побитовия XOR оператор или побитовите аритметични трикове. Python може също да се разменя директно с разопаковане на кортеж.

  • 🔘 Класически метод: Обичайната размяна държи една стойност във временна променлива, което тези техники избягват.
  • ➕ Аритметична размяна: Разменете стойности с a = a + b, след това b = a − b, след това a = a − b.
  • 🔀 XOR размяна: Приложете побитовия 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
Виждаме, че получихме стойността на 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 OperaTor

Този метод е известен още като 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. В този пример ще използваме операция XOR с 3. В повечето езици за програмиране 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 използвайки побитова аритметика

Този метод е същият като аритметичния метод, но ще използваме побитови операции като И, ИЛИ и допълнение, за да извършим събиране и извличане на данни.tracция. Преди да преминем към стъпките, нека набързо разгледаме „допълване“.

Допълнението до 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

От горното обсъждане, ако трябва да извършим под-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, което означава положително число.

Въпроси и Отговори

XOR размянаping е любимото на интервюто: без допълнителна памет, без препълване. Аритметиката е добър резервен вариант и Python разработчиците обикновено просто пишат a, b = b, a.

Не. Побитовото XOR работи само с целочислени битови комбинации, а не с числа с плаваща запетая, числа с двойна запетая или указатели. За числа с плаваща запетая използвайте разопаковане на кортежи или аритметична размяна.

Ако и двете променливи споделят една и съща памет, XOR размяната се извършваping задава стойността на 0. Добавя проверка if винаги, когато е възможно алиасинг.

Да: a = a * b, b = a / b, a = a / b. Но се получава грешка, когато някоя от стойностите е 0 и се губи точността на числото с плаваща запетая.

Само разопаковането на кортежи може. Записването на a, b = b, a разменя низове, списъци или обекти. Аритметичните и XOR триковете са само с цели числа.

Едва ли. Съвременните компилатори вече оптимизират размяната на временни променливи, така че този трик рядко подобрява скоростта. Readable Кодът е по-важен от запазването на една променлива.

Да. Кодът за машинно обучение разменя стойности с Python разопаковане на кортежи и numpy Индексирането като arr[[i, j]] = arr[[j, i]] разменя редовете на масива.

Да. GitHub Copilot и подобни AI асистенти генерират XOR, аритметични операции и разопаковане на кортежи от команден ред. RevПрегледайте всеки от тях за грешки, свързани с препълване и алиасинг.

Обобщете тази публикация с: