Python Programma om twee getallen te verwisselen zonder een derde variabele te gebruiken

โšก Slimme samenvatting

Ruilenping Twee getallen zonder een derde variabele wisselen hun waarden ter plekke uit door middel van rekenkundige optelling en aftrekking.tracde bitwise XOR-operator of bitwise-rekenkundige trucs. Python Je kunt ook rechtstreeks wisselen met behulp van tuple-unpacking.

  • ๐Ÿ”˜ Klassieke methode: Bij de gebruikelijke swap wordt รฉรฉn waarde in een tijdelijke variabele opgeslagen, iets wat met deze technieken wordt vermeden.
  • โž• Rekenkundige ruil: Wissel waarden om met a = a + b, vervolgens b = a โˆ’ b, en daarna a = a โˆ’ b.
  • ๐Ÿ”€ XOR-swap: Pas de bitwise XOR-operator drie keer toe om gehele getallen te verwisselen zonder overloop.
  • ๐Ÿงฎ Bitwise-rekenkunde: Gebruik de operatoren AND, OR en complement om optellen en aftrekken te reproduceren.tractie.
  • ๐Ÿ Python snelkoppeling: Tuple-uitpakking, a, b = b, a, verwisselt twee willekeurige waarden op รฉรฉn regel.
  • ๐Ÿค– AI en data: Tuple swaps en NumPy-indexering herschikken array-elementen in de voorbereiding op machine learning.

Wissel twee Numbers Zonder gebruik te maken van een derde variabele

De onderstaande paragrafen behandelen vier manieren om te wisselen zonder een tijdelijke variabele, plus rekenkundige overloop.

In programmeertalen, ruilenping Dit betekent het verwisselen van de waarden van twee variabelen. De variabele kan een getal, tekenreeks, lijst of array, object, enzovoort bevatten. De algemene manier om te verwisselen is door de waarden van twee variabelen te verwisselen.ping Een tijdelijke variabele gebruiken om waarden op te slaan, bijvoorbeeld:

Wissel twee Numbers

De algemene stappen van een swapping twee getallen zijn:

  • Declareer een tijdelijke variabele C
  • Wijs de waarde van A toe aan C, wat betekent dat C = A. Nu C = 20
  • Ken de waarde van B toe aan A, dus A = 30
  • Wijs de waarde van C toe aan B, dus B = 20, aangezien C de waarde 20 heeft.

Zo wissel je van gedachten.ping Dit gebeurt met behulp van een tijdelijke variabele en werkt zowel voor gehele getallen als voor drijvende-kommagetallen.

Wissel met behulp van rekenkundige vergelijkingen

Zoals we weten, ruilenping Dit betekent het verwisselen van de inhoud van twee objecten, velden of variabelen. Verwisselen met behulp van een rekenkundige bewerking betekent de verwisseling uitvoeren met behulp van een wiskundige vergelijking, bijvoorbeeld optellen en aftrekken.tractie.

Als we twee getallen krijgen en gevraagd worden om ze te verwisselen zonder een tijdelijke variabele te gebruiken, dan kunnen we de getallen verwisselen met behulp van drie rekenkundige vergelijkingen.

Pseudocode voor swapping getallen met behulp van een rekenkundige bewerking:

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

Laten we aannemen dat we twee getallen hebben, A = 20 en B = 30.

Staat 1: EEN=A+B

De huidige waarde van A is dus 20 + 30 = 50.

Staat 2: B = AB

Nu is B = 50-30 = 20
We kunnen zien dat we de waarde van A in B hebben gekregen.

Staat 3: EEN=AB

Tenslotte A = 50-20 = 30
A heeft de beginwaarde van B.

Dus we hebben de getallen omgedraaid.

Hier is het programma om twee getallen in C te verwisselen.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

Programma in 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

Nu in PythonWe hoeven zelfs geen rekenkundige bewerkingen uit te voeren. We kunnen gebruikmaken van:

a,b = b,a

Hier volgt een demonstratie waarbij a=20 en b=30;

Wissel met behulp van rekenkundige vergelijkingen

Ruilen met behulp van Bitwise XOR Operator

Deze methode staat ook bekend als XOR-swap. XOR staat voor Exclusive OR (exclusieve OF). Bij deze bitwise-bewerking gebruiken we twee bits als invoer voor de XOR-bewerking. Om รฉรฉn uitvoer te krijgen van de XOR-bewerking, moet slechts รฉรฉn van de invoerbits 1 zijn. Anders is de uitvoer 0. De volgende tabel toont de uitvoer voor alle combinaties van invoerbits A en B.

We moeten begrijpen hoe de XOR-bewerking werkt om twee getallen te verwisselen met behulp van een bitwise-bewerking. Hier is een tabel voor XOR, waarbij A en B de invoerwaarden zijn.

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

Als twee invoerwaarden gelijk zijn, geeft de XOR-bewerking 0; anders 1. In dit voorbeeld gebruiken we een 3XOR-bewerking. In de meeste programmeertalen wordt XOR aangeduid met "^".

Laten we aannemen dat A=4 (binair = 0100) en B=7 (binair = 0111).

Staat 1: EEN = EEN ^ B

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

Nu, A = 0011 (in binair getal).

Staat 2: B = A ^ B

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

Dus B = 0100, wat de initiรซle binaire waarde van A was.

Staat 3: EEN = EEN^B

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

Tenslotte A = 0111, wat de equivalente binaire waarde van B was.

Programma in 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.

Programma in 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.

Ruilen Numbers met behulp van Bitwise-rekenkunde

Deze methode is hetzelfde als de rekenkundige methode, maar we gebruiken bitwise-bewerkingen zoals AND, OR en complement om optellen en aftrekken uit te voeren.tracVoordat we naar de stappen gaan, laten we eerst even kort de betekenis van "complement" bekijken.

Het 1-complement betekent dat alle nullen in enen en alle enen in nullen worden veranderd. Laten we een voorbeeld nemen.

  • Laten we aannemen dat 23 een decimaal getal is.
  • Omzetten naar binair geeft ons 10111. Er zijn maar 5 bits, maar de computer slaat getallen op in 8, 16, 32, 64 โ€ฆ bits. Laten we daarom een โ€‹โ€‹nul voor het binaire getal plaatsen. Dit verandert de oorspronkelijke waarde van het getal niet. Het wordt dus 10111. 00010111.
  • Zoals we weten, betekent het 1-complement dat alle nullen in enen en alle enen in nullen worden veranderd. Het uitvoeren van het 1-complement over 00010111 geeft 11101000.

Het 1-complement wordt in de meeste programmeertalen weergegeven met het symbool "~". Door dit symbool voor een geheel getal of een drijvende-kommawaarde te plaatsen, krijg je het 1-complement.

En het 2-complement betekent het toevoegen van binaire โ€œ1โ€ aan het 1-complement. Als we 2's complementeren met het bovenstaande getal:

  • Binair = 00010111
  • 1's complement = 11101000
  • 2's complement:

11101000

+ 1

11101001

Het complement van 2 is dus 11101001. Dit is het binaire getal voor -23.
Samenvattend, voor het uitvoeren van het 2-complement van een getal A, zal het er als volgt uitzien:

2's complement van A = (~A) + 1

Laten we nu aannemen dat A=8 (binair 00001000) en B=10 (00001010).

Staat 1: EEN = (A & B) + (A | B)

Dit is gelijk aan A = A + B.

A & B = 00001000 & 00001010 = 00001000

Een | B = 00001000 | 00001010 = 00001010

Nu, 00001000 + 00001010 = 00010010 (decimaal 18)

Dus A = 18

Staat 2: B = EEN + (~B) + 1

Dit is gelijk aan B = AB

Hier geldt B = A โ€“ B

Uit de bovenstaande discussie blijkt dat als we een subprocedure moeten uitvoeren...tracVervolgens passen we het 2-complement toe op het negatieve getal en tellen we het resultaat erbij op.

Dus -B = ~B + 1

Nu is B = 00010010 + (11110101) + 1 = 00001000

De waarde van B is gelijk aan decimaal 8, wat de beginwaarde was.

Staat 3: EEN = EEN + (~B) + 1

Dit is gelijk aan A = AB

Nu is A = 00010010 + 11110111 + 1

A = 00001010 (equivalent aan decimaal 10)

Uiteindelijk kreeg A de waarde van B. Zo vond de ruil plaats.ping was voltooid.

Programma in 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

Programma in 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

Wat is rekenkundige overloop?

De term 'overloop' betekent het overschrijden van de limiet. Rekenkundige overloop betekent dat het resultaat van een rekenkundige bewerking het bereik of de limiet van de getalrepresentatie van de computerarchitectuur overschrijdt. Als een getal bijvoorbeeld door nul wordt gedeeld, wordt het oneindig en kan het getalsysteem van de computer dit niet in 32 of 64 bits opslaan.

Weergave van gehele getallen

Representatie van gehele getallen in een 32-bits systeem

Het gevolg van de rekenkundige overloop kan zijn:

  • De optelling van twee positieve getallen wordt negatief, omdat het tekenbit 1 kan worden, wat een negatief getal betekent.
  • De optelling van twee negatieve getallen wordt positief, omdat het tekenbit 0 kan worden, wat een positief getal betekent.

Veelgestelde vragen

XOR-ruilping is de favoriet onder de interviewers: geen extra geheugen, geen overloop. Rekenen is een prima back-up, en Python Ontwikkelaars schrijven meestal gewoon a, b = b, a.

Nee. Bitwise XOR werkt alleen op gehele getallen, niet op drijvende-kommagetallen, doubles of pointers. Gebruik voor drijvende-kommagetallen in plaats daarvan tuple unpacking of de rekenkundige swap.

Als beide variabelen dezelfde geheugenlocatie delen, voer dan een XOR-swap uit.ping Stelt de waarde in op 0. Voeg een if-controle toe wanneer aliasing mogelijk is.

Ja: a = a * b, b = a / b, a = a / b. Maar het werkt niet als een van beide waarden 0 is en de precisie van de drijvende-komma-berekening verloren gaat.

Alleen tuple-unpacking is mogelijk. Door a, b = b, a te schrijven, worden strings, lijsten of objecten verwisseld. De rekenkundige en XOR-trucs werken alleen met gehele getallen.

Nauwelijks. Moderne compilers optimaliseren het wisselen van tijdelijke variabelen al, dus deze truc levert zelden een snelheidsverbetering op. Readable Code is belangrijker dan het opslaan van รฉรฉn variabele.

Ja. Machine learning-code wisselt waarden om met Python tuple-uitpakking, en NumPy Indexering zoals arr[[i, j]] = arr[[j, i]] verwisselt de rijen van een array op hun plaats.

Ja. GitHub Copilot en vergelijkbare AI-assistenten kunnen XOR-, rekenkundige en tuple-uitpakbewerkingen uitvoeren op basis van een prompt. RevControleer ze elk op overloop- en aliasingfouten.

Vat dit bericht samen met: