Python Program do zamiany dwóch liczb bez użycia trzeciej zmiennej

⚡ Inteligentne podsumowanie

Zamianaping dwie liczby bez trzeciej zmiennej zamieniają się wartościami w miejscu, stosując dodawanie arytmetyczne i podzbiórtraccja, operator bitowy XOR lub sztuczki arytmetyczne bitowe. Python można również zamieniać bezpośrednio za pomocą rozpakowywania krotek.

  • 🔘 Metoda klasyczna: Zwykła zamiana przechowuje jedną wartość w zmiennej tymczasowej, czego te techniki unikają.
  • Zamiana arytmetyczna: Zamień wartości na a = a + b, następnie b = a − b, a następnie a = a − b.
  • 🔀 Zamiana XOR: Zastosuj operator XOR bitowy trzy razy, aby zamienić liczby całkowite bez przepełnienia.
  • 🧮 Arytmetyka bitowa: Użyj operatorów AND, OR i uzupełnień, aby odtworzyć dodawanie i podpisywanie.traccja.
  • 🐍 Python skrót: Rozpakowywanie krotki, a, b = b, a, zamienia dowolne dwie wartości w jednym wierszu.
  • 🤖 Sztuczna inteligencja i dane: Zamiana krotek i indeksowanie NumPy zmieniają kolejność elementów tablicy w przygotowaniu do uczenia maszynowego.

Zamień dwa Numbers Bez użycia trzeciej zmiennej

Poniższe sekcje obejmują cztery sposoby wykonania zamiany bez zmiennej tymczasowej oraz przepełnienie arytmetyczne.

W językach programowania zamianaping Oznacza wymianę wartości dwóch zmiennych. Zmienna może zawierać liczbę, ciąg znaków, listę lub tablicę, obiekt itp. Ogólny sposób zamianyping polega na użyciu zmiennej tymczasowej do przechowywania wartości. Na przykład,

Zamień dwa Numbers

Ogólne kroki wymianyping dwie liczby to:

  • Zadeklaruj zmienną tymczasową C
  • Przypisz wartość A do C, czyli C = A. Teraz C = 20
  • Przypisz wartość B do A, więc A = 30
  • Przypisz wartość C do B, więc B = 20, ponieważ C ma wartość 20.

Tak się zamieniaping odbywa się za pomocą zmiennej tymczasowej i działa zarówno dla liczb całkowitych, jak i zmiennoprzecinkowych.

Zamień za pomocą równania arytmetycznego

Jak wiemy, zamianaping Oznacza zamianę zawartości dwóch obiektów, pól lub zmiennych. Zamiana za pomocą operacji arytmetycznej oznacza wykonanie zamiany za pomocą równania matematycznego, tj. dodawania i podmiany.traccja.

Jeśli mamy dwie liczby i zostaniemy poproszeni o zamianę bez użycia zmiennej tymczasowej, możemy zamienić liczby za pomocą trzech równań arytmetycznych.

Pseudokod do zamianyping liczby za pomocą operacji arytmetycznej:

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

Załóżmy, że mamy dwie liczby: A = 20 i B = 30.

Warunek 1: A = A+B

Zatem aktualna wartość A wynosi 20+30 = 50

Warunek 2: B = AB

Teraz B = 50-30 = 20
Widzimy, że otrzymaliśmy wartość A w B.

Warunek 3: A = AB

Wreszcie A = 50-20 = 30
A ma początkową wartość B.

Więc po prostu zamieniliśmy numery.

Oto program do zamiany dwóch liczb w 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);
}

Wyjście:

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

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

Wyjście:

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

Teraz w Python, nie musimy nawet wykonywać operacji arytmetycznych. Możemy użyć:

a, b = b, a

Oto demonstracja, gdzie a=20, b=30;

Zamień za pomocą równania arytmetycznego

Zamiana przy użyciu Bitwise XOR OperaTor

Ta metoda jest również znana jako zamiana XOR. XOR oznacza alternatywę alternatywną (OR). W tej operacji bitowej bierzemy dwa bity jako dane wejściowe do XOR. Aby uzyskać jedno wyjście z XOR, tylko jedno wejście musi być równe 1. W przeciwnym razie wyjście będzie równe 0. Poniższa tabela przedstawia wyjście dla wszystkich kombinacji wejść A i B.

Musimy wiedzieć, jak działa operacja XOR, aby zamienić dwie liczby za pomocą operacji bitowej. Oto tabela dla operacji XOR, gdzie A i B to wartości wejściowe.

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

Jeśli dwa dane wejściowe mają tę samą wartość, operacja XOR zwraca 0; w przeciwnym razie 1. W tym przykładzie użyjemy operacji XOR 3. W większości języków programowania operacja XOR jest oznaczana jako „^”.

Załóżmy, że A=4 (w systemie binarnym = 0100) i B=7 (w systemie binarnym, 0111)

Warunek 1: A = ZA ^ B

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

Teraz A = 0011 (w formacie binarnym).

Warunek 2: B = A^B

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

Zatem B = 0100, co było początkową wartością binarną A.

Warunek 3: A = A^B

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

Wreszcie A = 0111, co było równoważną wartością binarną B.

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

Wyjście:

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

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

Wyjście:

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

Zamiana Numbers używając arytmetyki bitowej

Ta metoda jest taka sama jak metoda arytmetyczna, ale do dodawania i podliczania użyjemy operacji bitowych, takich jak AND, OR i uzupełnienie.tracZanim przejdziemy do kolejnych kroków, przyjrzyjmy się pokrótce pojęciu „uzupełnienia”.

Uzupełnienie do 1 oznacza zamianę wszystkich 0 na 1 i 1 na 0. Weźmy na przykład.

  • Załóżmy, że liczba 23 jest liczbą dziesiętną.
  • Konwersja na system binarny daje nam 10111. Jest tylko 5 bitów, ale komputer przechowuje liczby w 8, 16, 32, 64… bitach. Dodajmy więc zero przed systemem binarnym. Nie zmieni to pierwotnej wartości liczby. W rezultacie będzie ona… 00010111.
  • Jak wiemy, uzupełnienie do 1 oznacza zamianę wszystkich 0 na 1 i 1 na 0, dlatego wykonując uzupełnienie do 1 00010111 daje 11101000.

To uzupełnienie do jedynki jest reprezentowane symbolem „~” w większości języków programowania. Umieszczenie tego symbolu przed wartościami całkowitymi lub zmiennoprzecinkowymi spowoduje utworzenie uzupełnienia do jedynki.

A uzupełnienie do 2 oznacza dodanie binarnej „1” do uzupełnienia do 1. Jeśli uzupełnimy dwójkę do powyższej liczby:

  • Binarny = 00010111
  • Uzupełnienie do 1 = 11101000
  • Uzupełnienie do 2:

11101000

+ 1

11101001

Zatem uzupełnienie 2 to 11101001. To jest binarny dla -23.
Podsumowując, wykonanie uzupełnienia liczby A do 2 będzie wyglądać następująco:

Dopełnienie 2 A = (~A) + 1

Załóżmy teraz, że A=8 (binarnie 00001000), B=10 (00001010)

Warunek 1: A = (A i B) + (A | B)

Jest to równoważne równaniu A = A + B.

A i B = 00001000 i 00001010 = 00001000

| B = 00001000 | 00001010 = 00001010

Teraz 00001000 + 00001010 = 00010010 (dziesiętne 18)

Zatem A = 18

Warunek 2: B = A + (~B) + 1

Jest to równoważne z B = AB

Tutaj B = A – B

Z powyższej dyskusji wynika, że ​​jeśli musimy wykonać podprogramtracNastępnie wykonujemy uzupełnienie do 2 do liczby ujemnej i ją dodajemy.

Zatem -B = ~B + 1

Teraz B = 00010010 + (11110101) + 1 = 00001000

Wartość B jest równa liczbie dziesiętnej 8, która była wartością początkową.

Warunek 3: A = A + (~B) + 1

Jest to równoważne z A = AB

Teraz A = 00010010 + 11110111 + 1

A = 00001010 (odpowiednik liczby dziesiętnej 10)

Na koniec A otrzymał wartość B. W ten sposób nastąpiła zamianaping zostało zakończone.

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

Wyjście:

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

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

Wyjście:

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

Co to jest przepełnienie arytmetyczne?

Termin „przepełnienie” oznacza przekroczenie limitu. Przepełnienie arytmetyczne oznacza, że ​​wynik dowolnej operacji arytmetycznej przekracza zakres lub limit reprezentacji liczbowej architektury komputerowej. Na przykład, jeśli liczba zostanie podzielona przez zero, staje się nieskończona, a komputerowy system liczbowy nie może jej pomieścić w 32 lub 64 bitach.

Reprezentacja liczb całkowitych

Reprezentacja liczb całkowitych w systemie 32-bitowym

Konsekwencją przepełnienia arytmetycznego może być:

  • Dodanie dwóch liczb dodatnich staje się liczbą ujemną, ponieważ bit znaku może przyjąć wartość 1, co oznacza liczbę ujemną.
  • Dodanie dwóch liczb ujemnych staje się liczbą dodatnią, ponieważ bit znaku może przyjąć wartość 0, co oznacza liczbę dodatnią.

FAQ

Zamiana XORping jest faworytem w rozmowach kwalifikacyjnych: brak dodatkowej pamięci, brak przepełnienia. Arytmetyka to niezłe wsparcie, a Python Programiści zazwyczaj piszą po prostu a, b = b, a.

Nie. Bitowe XOR działa tylko na wzorcach bitowych liczb całkowitych, a nie na liczbach zmiennoprzecinkowych, zmiennoprzecinkowych ani wskaźnikach. W przypadku liczb zmiennoprzecinkowych należy zamiast tego użyć rozpakowywania krotek lub zamiany arytmetycznej.

Jeżeli obie zmienne współdzielą jedną lokalizację pamięci, należy wykonać zamianę XORping ustawia wartość na 0. Dodaj sprawdzenie if, jeśli aliasing jest możliwy.

Tak: a = a * b, b = a / b, a = a / b. Jednak błąd pojawia się, gdy którakolwiek z wartości jest równa 0, co powoduje utratę precyzji zmiennoprzecinkowej.

Tylko rozpakowanie krotki jest możliwe. Zapis a, b = b, a zamienia ciągi znaków, listy lub obiekty. Sztuczki arytmetyczne i XOR dotyczą tylko liczb całkowitych.

Ledwo. Nowoczesne kompilatory już optymalizują zamianę zmiennych tymczasowych, więc ta sztuczka rzadko poprawia szybkość. Readable kod jest ważniejszy niż zapisanie jednej zmiennej.

Tak. Kod uczenia maszynowego zamienia wartości Python rozpakowywanie krotek i numpy Indeksowanie takie jak arr[[i, j]] = arr[[j, i]] zamienia wiersze tablicy w miejscu.

Tak. GitHub Copilot i podobne asystenty AI generują zamiany XOR, arytmetyczne i rozpakowujące krotki z poziomu wiersza poleceń. Revsprawdź każdy z nich pod kątem błędów przepełnienia i aliasingu.

Podsumuj ten post następująco: