Python Ohjelma kahden luvun vaihtamiseksi käyttämättä kolmatta muuttujaa

⚡ Älykäs yhteenveto

Vaihtaaping kaksi lukua ilman kolmatta muuttujaa vaihtavat arvonsa paikoilleen käyttämällä aritmeettista yhteenlaskua ja osalaskuatractiota, bittikohtaista XOR-operaattoria tai bittikohtaisia ​​aritmeettisia temppuja. Python voi myös vaihtaa suoraan tuplen purkamisen yhteydessä.

  • 🔘 Klassinen menetelmä: Tavallinen swap-operaatio sisältää yhden arvon väliaikaisessa muuttujassa, mitä näillä tekniikoilla vältetään.
  • Aritmeettinen vaihto: Vaihda arvot seuraavasti: a = a + b, sitten b = a − b ja sitten a = a − b.
  • 🔀 XOR-vaihto: Käytä bittikohtaista XOR-operaattoria kolme kertaa vaihtaaksesi kokonaislukuja ilman ylivuotoa.
  • 🧮 Bittikohtainen aritmetiikka: Käytä AND-, OR- ja komplementtioperaattoreita yhteenlaskun ja osalaskun toistamiseentracseen.
  • 🐍 Python pikakuvake: Tuplen purkaminen, a, b = b, a, vaihtaa mitkä tahansa kaksi arvoa samalla rivillä.
  • 🤖 Tekoäly ja data: Tuple-vaihdot ja NumPy-indeksointi järjestävät taulukon elementit koneoppimisen valmistelussa.

Vaihda kaksi Numbers Ilman kolmatta muuttujaa

Alla olevat osiot käsittelevät neljää tapaa vaihtaa ilman väliaikaista muuttujaa sekä aritmeettista ylivuotoa.

Ohjelmointikielissä swapping tarkoittaa kahden muuttujan arvojen vaihtamista. Muuttuja voi sisältää numeron, merkkijonon, listan tai taulukon, objektin jne. Yleinen vaihtotapaping on käyttää väliaikaista muuttujaa arvojen säilyttämiseen. Esimerkiksi

Vaihda kaksi Numbers

Vaihdon yleiset vaiheetping kaksi numeroa ovat:

  • Ilmoita väliaikainen muuttuja C
  • Määritä A:n arvoksi C, mikä tarkoittaa, että C = A. Nyt C = 20
  • Anna B:n arvo A:lle, joten A = 30
  • Anna C:n arvo B:lle, joten B = 20, koska C:n arvo on 20.

Näin vaihto tapahtuuping tehdään väliaikaisen muuttujan avulla, ja se toimii sekä kokonaisluku- että liukulukujen kanssa.

Vaihda käyttämällä aritmeettista yhtälöä

Kuten tiedämme, vaihtoping tarkoittaa kahden objektin, kentän tai muuttujan sisällön vaihtamista. Vaihto aritmeettisella operaatiolla tarkoittaa vaihdon suorittamista matemaattisen yhtälön avulla, eli yhteenlaskulla ja osalaskulla.tracseen.

Jos meille annetaan kaksi lukua ja pyydetään vaihtamaan ne keskenään käyttämättä väliaikaista muuttujaa, niin voimme vaihtaa luvut keskenään käyttämällä kolmea aritmeettista yhtälöä.

Pseudokoodi swapilleping numerot aritmeettisen operaation avulla:

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

Oletetaan, että meillä on kaksi lukua, A = 20 ja B = 30.

Ehto 1: A = A+B

Joten A:n nykyinen arvo on 20 + 30 = 50

Ehto 2: B = AB

Nyt B = 50-30 = 20
Voimme nähdä, että saimme A:n arvon B:ssä.

Ehto 3: A = AB

Lopuksi A = 50-20 = 30
A:n alkuarvo on B.

Vaihdoimme siis vain numeroita.

Tässä on ohjelma kahden C-kielisen luvun vaihtamiseksi.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);
}

lähtö:

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

Ohjelma sisään 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))

lähtö:

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

Nyt sisällä Python, meidän ei tarvitse edes suorittaa aritmeettisia laskutoimituksia. Voimme käyttää:

a,b = b,a

Tässä on demonstraatio, jossa a=20, b=30;

Vaihda käyttämällä aritmeettista yhtälöä

Vaihda Bitwise XOR:lla OperaTor

Tätä menetelmää kutsutaan myös XOR-vaihdoksi. XOR tarkoittaa eksklusiivista TAI-operaatiota. Tässä bittikohtaisessa operaatiossa XOR-operaation syötteinä käytetään kaksi bittiä. Jotta XOR-operaatiosta saataisiin yksi lähtö, vain toisen tulon on oltava 1. Muuten lähtö on 0. Seuraava taulukko näyttää kaikkien tulojen A ja B yhdistelmien lähdön.

Meidän on tiedettävä, miten XOR-operaatio toimii kahden luvun vaihtamiseksi bittikohtaisesti. Tässä on taulukko XOR-operaatiolle, jossa A ja B ovat syöttöarvot.

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

Jos kahdella syötteellä on sama arvo, XOR-operaatio antaa arvon 0; muuten arvon 1. Tässä esimerkissä käytämme 3 XOR-operaatiota. Useimmissa ohjelmointikielissä XOR merkitään merkeillä "^".

Oletetaan, että A=4 (binäärimuodossa = 0100) ja B=7 (binäärimuodossa 0111)

Ehto 1: A = A ^ B

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

Nyt A = 0011 (binäärimuodossa).

Ehto 2: B = A^B

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

Joten B = 0100, joka oli A:n alkuperäinen binääriarvo.

Ehto 3: A = A^B

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

Lopuksi A = 0111, joka oli B:n ekvivalentti binääriarvo.

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

lähtö:

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

Ohjelma sisään 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))

lähtö:

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

Vaihtaa Numbers käyttämällä bittiaritmetiikkaa

Tämä menetelmä on sama kuin aritmeettinen menetelmä, mutta käytämme bittikohtaisia ​​operaatioita, kuten JA, TAI ja komplementti, yhteen- ja osalaskujen suorittamiseen.tracEnnen kuin siirrymme vaiheisiin, tarkastellaanpa nopeasti sanaa ”täydennys”.

Ykkösen komplementti tarkoittaa kaikkien nollien muuttamista ykkösiksi ja ykkösten muuttamista nollaksi. Otetaan esimerkki.

  • Oletetaan, että luku 23 on desimaaliluku.
  • Binääriluvuksi muuntaminen antaa meille luvun 10111. Bittejä on vain 5, mutta tietokone tallentaa numerot 8, 16, 32, 64 … bittiin. Lisätään siis nolla binääriluvun eteen. Se ei muuta luvun alkuperäistä arvoa. Joten siitä tulee 00010111.
  • Kuten tiedämme, ykkösen komplementti tarkoittaa kaikkien nollien muuttamista ykkösiksi ja ykkösten muuttamista nollaksi, joten ykkösen komplementin suorittaminen yli 00010111 antaa 11101000.

Tämä ykkösten komplementti esitetään useimmissa ohjelmointikielissä symbolilla "~". Tämän symbolin sijoittaminen kokonaislukuarvojen tai liukulukuarvojen eteen antaa ykkösten komplementin.

Ja 2:n komplementti tarkoittaa binaarisen "1" lisäämistä 1:n komplementtiin. Jos teemme 2:n täydennyksen yllä olevaan numeroon:

  • Binääri = 00010111
  • Ykkösen komplementti = 11101000
  • 2:n komplementti:

11101000

+ 1

11101001

Joten 2:n komplementti on 11101001. Tämä on -23:n binaari.
Yhteenvetona voidaan todeta, että luvun A komplementin suorittaminen 2:lla näyttää tältä:

2:n komplementti A = (~A) + 1

Oletetaan nyt, että A=8 (binääri 00001000), B=10 (00001010)

Ehto 1: A = (A & B) + (A | B)

Se on yhtä kuin A = A + B.

A & B = 00001000 & 00001010 = 00001000

A | B = 00001000 | 00001010 = 00001010

Nyt, 00001000 + 00001010 = 00010010 (desimaali 18)

Eli A = 18

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

Se on yhtä kuin B = AB

Tässä B = A - B

Yllä olevan keskustelun perusteella, jos meidän on suoritettava osatractilanteessa suoritamme negatiiviselle luvulle 2:n komplementin ja sitten lisäämme sen.

Joten -B = ~B + 1

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

B:n arvo vastaa desimaalilukua 8, joka oli alkuarvo.

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

Se on yhtä kuin A = AB

Nyt A = 00010010 + 11110111 + 1

A = 00001010 (vastaa desimaalilukua 10)

Lopulta A sai B:n arvon. Näin ollen vaihtoping oli suoritettu.

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

lähtö:

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

Ohjelma sisään 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))

lähtö:

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

Mikä on aritmeettinen ylivuoto?

Ylivuoto-termi tarkoittaa rajan ylittämistä. Aritmeettinen ylivuoto tarkoittaa, että minkä tahansa aritmeettisen operaation tulos ylittää tietokoneen arkkitehtuurin numeroesityksen alueen tai rajan. Esimerkiksi jos luku jaetaan nollalla, siitä tulee ääretön, eikä tietokoneen lukujärjestelmä pysty säilyttämään sitä 32 tai 64 bittiin.

Kokonaislukuesitys

Kokonaislukuesitys 32-bittisessä järjestelmässä

Aritmeettisen ylivuodon seuraus voi olla:

  • Kahden positiivisen luvun yhteenlasku muuttuu negatiiviseksi, koska etumerkkibitistä voi tulla 1, mikä tarkoittaa negatiivista lukua.
  • Kahden negatiivisen luvun yhteenlasku muuttuu positiiviseksi, koska etumerkki voi muuttua nollaksi, mikä tarkoittaa positiivista lukua.

UKK

XOR-vaihtoping on haastattelun suosikki: ei ylimääräistä muistia, ei ylivuotoa. Aritmetiikka on kohtuullinen varmuuskopio, ja Python kehittäjät kirjoittavat yleensä vain a, b = b, a.

Ei. Bittikohtainen XOR toimii vain kokonaislukubittikuvioissa, ei liukulukujen, tuplalukujen tai osoittimien kanssa. Liukulukujen kohdalla käytä tuplen purkamista tai aritmeettista vaihtoa.

Jos molemmat muuttujat jakavat saman muistipaikan, XOR-vaihtoping asettaa arvoksi 0. Lisää if-tarkistus aina, kun aliasointi on mahdollista.

Kyllä: a = a * b, b = a / b, a = a / b. Mutta se epäonnistuu, kun jompikumpi arvoista on 0, ja liukulukujen tarkkuus menetetään.

Vain tuplen purkaminen voi. Kirjoittamalla a, b = b, a vaihtaa merkkijonoja, listoja tai objekteja. Aritmeettiset ja XOR-temput ovat vain kokonaislukuja.

Tuskin. Nykyaikaiset kääntäjät optimoivat jo väliaikaisten muuttujien swapit, joten tämä temppu harvoin parantaa nopeutta. Readable koodilla on enemmän merkitystä kuin yhden muuttujan tallentamisella.

Kyllä. Koneoppimiskoodi vaihtaa arvoja keskenään Python tuplen purkaminen ja nuhjuinen Indeksointi, kuten arr[[i, j]] = arr[[j, i]], vaihtaa taulukon rivit paikoilleen.

Kyllä. GitHub Copilot ja vastaavat tekoälyavustajat tuottavat XOR-operaatioita, aritmeettisia toimintoja ja tuplen purkavia swap-operaatioita kehotteesta. Revtarkista jokainen ylivuoto- ja aliasointivirheiden varalta.

Tiivistä tämä viesti seuraavasti: