Python Programozzon két szám felcserélésére harmadik változó használata nélkül

⚡ Okos összefoglaló

Csereping két szám harmadik változó nélkül felcseréli az értékét aritmetikai összeadással és részműveletteltracció, a bitenkénti XOR operátor, vagy bitenkénti aritmetikai trükkök. Python közvetlenül is cserélhető a tuple kicsomagolásával.

  • 🔘 Klasszikus módszer: A szokásos swap egy értéket tárol egy ideiglenes változóban, amit ezek a technikák elkerülnek.
  • Számtani csere: Cseréljünk fel értékeket a = a + b, majd b = a − b, majd a = a − b alapján.
  • 🔀 XOR csere: Alkalmazd a bitenkénti XOR operátort háromszor az egész számok túlcsordulás nélküli cseréjéhez.
  • 🧮 Bitenkénti aritmetika: Az ÉS, VAGY és a komplementer operátorok használatával reprodukálhatja az összeadást és a részfelosztást.tracCIÓ.
  • 🐍 Python parancsikon: A tuple kicsomagolása, a, b = b, a, egy sorban bármely két értéket felcserél.
  • 🤖 MI és adatok: Tuple cserék és NumPy indexelés tömbelemek átrendezése gépi tanulási előkészítésben.

Cserélj kettőt Numbers Harmadik változó használata nélkül

Az alábbi szakaszok négy módszert tárgyalnak az ideiglenes változó nélküli cserére, valamint az aritmetikai túlcsordulást.

Programozási nyelvekben a swapping két változó értékének felcserélését jelenti. A változó tartalmazhat számot, karakterláncot, listát vagy tömböt, objektumot stb. A csere általános módjaping az, hogy egy ideiglenes változót használunk az értékek tárolására. Például,

Cserélj kettőt Numbers

A csere általános lépéseiping két szám a következő:

  • Deklarálj egy ideiglenes C változót
  • Rendelje A értékét C-hez, ami azt jelenti, hogy C = A. Most C = 20
  • Rendelje B értékét A-hoz, tehát A = 30
  • Rendelje C értékét B-hez, tehát B = 20, mivel C értéke 20.

Így cserélikping egy ideiglenes változó segítségével történik, és egész és lebegőpontos számok esetén is működik.

Csere az aritmetikai egyenlet segítségével

Mint tudjuk, csereping két objektum, mező vagy változó tartalmának felcserélését jelenti. A csere aritmetikai művelettel azt jelenti, hogy a cserét matematikai egyenlet segítségével hajtják végre, azaz összeadás és részművelet.tracCIÓ.

Ha adottak vagyunk két számnak, és ideiglenes változó használata nélkül cseréljük fel őket, akkor három számtani egyenlet segítségével felcserélhetjük a számokat.

Pszeudokód a swaphozping számok aritmetikai művelettel:

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

Tegyük fel, hogy két számunk van, A = 20 és B = 30.

1. feltétel: A = A+B

Tehát az A jelenlegi értéke 20 + 30 = 50

2. feltétel: B = AB

Most B = 50-30 = 20
Láthatjuk, hogy megkaptuk A értékét B-ben.

3. feltétel: A = AB

Végül A = 50-20 = 30
A kezdeti értéke B.

Szóval felcseréltük a számokat.

Itt egy program, amivel két számot felcserélhetünk C-ben.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

Program be 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

Most Python, még csak aritmetikai műveleteket sem kell végrehajtanunk. Használhatjuk:

a,b = b,a

Íme egy bemutató, ahol a=20, b=30;

Csere az aritmetikai egyenlet segítségével

Csere a Bitwise XOR használatával Operator

Ez a módszer XOR swap néven is ismert. Az XOR kizáró VAGY műveletet jelent. Ebben a bitenkénti műveletben két bitet veszünk bemenetként az XOR művelethez. Ahhoz, hogy egy XOR kimenetet kapjunk, csak az egyik bemenetnek kell 1-nek lennie. Ellenkező esetben a kimenet 0 lesz. A következő táblázat az A és B bemenetek összes kombinációjának kimenetét mutatja.

Tudnunk kell, hogyan működik az XOR művelet két szám bitenkénti felcseréléséhez. Itt egy táblázat az XOR műveletre, ahol A és B a bemeneti értékek.

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

Ha két bemenet értéke megegyezik, akkor az XOR művelet 0-t ad; egyébként 1-et. Ebben a példában egy 3 XOR műveletet fogunk használni. A legtöbb programozási nyelvben az XOR-t „^” jelöli.

Tegyük fel, hogy A=4 (binárisan = 0100) és B=7 (binárisan 0111).

1. feltétel: A = A ^ B

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

Most A = 0011 (binárisan).

2. feltétel: B = A^B

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

Tehát B = 0100, ami A kezdeti bináris értéke volt.

3. feltétel: A = A^B

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

Végül A = 0111, amely B ekvivalens bináris értéke volt.

Program 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.

Program be 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.

Csere Numbers bitenkénti aritmetika használatával

Ez a módszer megegyezik az aritmetikai módszerrel, de bitenkénti műveleteket, például ÉS, VAGY és komplementer műveleteket fogunk használni az összeadás és a részösszevonás elvégzéséhez.tracMielőtt rátérnénk a lépésekre, nézzük át gyorsan a „kiegészítés” fogalmát.

Az 1-es komplemens azt jelenti, hogy az összes 0-t 1-re és az 1-et 0-ra cseréljük. Vegyünk egy példát.

  • Tegyük fel, hogy a 23 egy decimális szám.
  • Binárisra konvertálva 10111-et kapunk. Csak 5 bit van, de a számítógép 8, 16, 32, 64 … biten tárolja a számokat. Tehát adjunk hozzá nullát a bináris szám elé. Ez nem fogja megváltoztatni a szám eredeti értékét. Tehát a következő lesz: 00010111.
  • Mint tudjuk, az 1-es komplemens azt jelenti, hogy az összes 0-t 1-re és 1-et 0-ra cseréljük, tehát az 1-es komplemens végrehajtása 00010111 ad 11101000.

Ezt az egyes komplementert a legtöbb programozási nyelvben a „~” szimbólum jelöli. Ha ezt a szimbólumot egész szám vagy lebegőpontos érték elé helyezzük, akkor megkapjuk az egyes komplementert.

A 2-es komplementere pedig azt jelenti, hogy bináris „1”-et adunk az 1-es komplementeréhez. Ha a fenti számhoz 2 kiegészítést teszünk:

  • Bináris = 00010111
  • 1-es komplemens = 11101000
  • 2-es komplementer:

11101000

+ 1

11101001

Tehát a 2 komplementere 11101001. Ez a -23 binárisa.
Összefoglalva, egy A szám 2-es kiegészítésének végrehajtása a következőképpen fog kinézni:

2 komplementere A = (~A) + 1

Most tegyük fel, hogy A=8 (bináris 00001000), B=10 (00001010)

1. feltétel: A = (A és B) + (A | B)

Ez egyenértékű az A = A + B képlettel.

A és B = 00001000 és 00001010 = 00001000

A | B = 00001000 | 00001010 = 00001010

Most, 00001000 + 00001010 = 00010010 (tizedesjegy 18)

Tehát A = 18

2. feltétel: B = A + (~B) + 1

Ez egyenértékű a B = AB képlettel.

Itt B = A – B

A fentiekből kiindulva, ha részfeladatokat kell végrehajtanunktraccióban elvégezzük a negatív szám 2-es komplemensét, majd összeadjuk.

Tehát -B = ~B + 1

Most, B = 00010010 + (11110101) + 1 = 00001000

B értéke megegyezik a 8-as decimális számmal, amely a kezdeti érték volt.

3. feltétel: A = A + (~B) + 1

Ez egyenértékű az A = AB képlettel.

Most A = 00010010 + 11110111 + 1

A = 00001010 (egyenértékű a 10-es decimális számmal)

Végül A megkapta B értékét. Így a csereping befejeződött.

Program 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

Program be 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

Mi az aritmetikai túlcsordulás?

A „túlcsordulás” kifejezés a határérték túllépését jelenti. A számtani túlcsordulás azt jelenti, hogy bármely számtani művelet eredménye meghaladja a számítógép architektúrájának számábrázolási tartományát vagy határértékét. Például, ha egy számot nullával osztunk, az végtelenné válik, és a számítógépes számrendszer nem tudja 32 vagy 64 biten tárolni.

Egész számok ábrázolása

Egész számok ábrázolása 32 bites rendszerben

Az aritmetikai túlcsordulás következménye lehet:

  • Két pozitív szám összeadása negatívvá válik, mivel az előjelbit 1 lehet, ami negatív számot jelent.
  • Két negatív szám összeadása pozitívvá válik, mivel az előjelbit 0 lehet, ami pozitív számot jelent.

GYIK

XOR csereping az interjú kedvence: nincs plusz memória, nincs túlcsordulás. Az aritmetika egy jó biztonsági mentés, és Python a fejlesztők általában csak azt írják, hogy a, b = b, a.

Nem. A bitenkénti XOR csak egész bitmintákon működik, lebegőpontos, dupla vagy mutatókon nem. Lebegőpontos számok esetén használd a tuple kicsomagolását vagy az aritmetikai cserét.

Ha mindkét változó egy memóriahelyet oszt meg, XOR csere történik.ping 0-ra állítja az értéket. Adjon hozzá egy if ellenőrzést, amikor az aliasing lehetséges.

Igen: a = a * b, b = a / b, a = a / b. De hibát jelez, ha bármelyik érték 0, és elveszíti a lebegőpontosságot.

Csak a tuple kicsomagolása képes erre. Az a, b = b írása esetén a karakterláncokat, listákat vagy objektumokat cserél fel. Az aritmetikai és XOR trükkök csak egész számokat tartalmaznak.

Alig. A modern fordítóprogramok már optimalizálják az ideiglenes változók swapjait, így a trükk ritkán javítja a sebességet. Readable A kód fontosabb, mint egyetlen változó mentése.

Igen. A gépi tanulási kód értékeket cserél a következővel: Python tuple kicsomagolás, és numpy Az arr[[i, j]] = arr[[j, i]] típusú indexelés felcseréli a tömb sorait.

Igen. A GitHub Copilot és hasonló mesterséges intelligencia asszisztensek XOR, aritmetikai és tuple-kicsomagoló swap műveleteket hoznak létre egy promptból. RevTekintse meg mindegyiket túlcsordulási és aliasing hibák szempontjából.

Foglald össze ezt a bejegyzést a következőképpen: