Python Programm kahe arvu vahetamiseks ilma kolmandat muutujat kasutamata

⚡ Nutikas kokkuvõte

Vahetamaping Kaks arvu ilma kolmanda muutujata vahetavad oma väärtused aritmeetilise liitmise ja alalõike abil.tractsioon, bitipõhine XOR-operaator või bitipõhised aritmeetilised nipid. Python saab ka otse tuple lahtipakkimisega vahetada.

  • 🔘 Klassikaline meetod: Tavaline vahetus hoiab ühte väärtust ajutises muutujas, mida need tehnikad väldivad.
  • Aritmeetiline vahetus: Vaheta väärtused järgmiselt: a = a + b, siis b = a − b ja siis a = a − b.
  • 🔀 XOR-vahetus: Rakendage bitipõhist XOR-operaatorit kolm korda, et vahetada täisarve ilma ületäitumiseta.
  • 🧮 Bitipõhine aritmeetika: Liitmise ja alalõike taasesitamiseks kasutage operaatoreid AND, OR ja täiendusoperaatoreidtracmise kohta.
  • 🐍 Python otsetee: Tuple'i lahtipakkimine, a, b = b, a, vahetab ühel real kaks suvalist väärtust.
  • 🤖 Tehisintellekt ja andmed: Masinõppe ettevalmistuses tuple vahetused ja NumPy indekseerimine massiivi elementide ümberjärjestamiseks.

Vaheta kaks Numbers Kolmandat muutujat kasutamata

Allolevad jaotised käsitlevad nelja viisi ajutise muutujata vahetamiseks ja aritmeetilist ületäitumist.

Programmeerimiskeeltes vahetatakseping tähendab kahe muutuja väärtuste vahetamist. Muutuja võib sisaldada arvu, stringi, loendit või massiivi, objekti jne. Üldine vahetamise viisping on kasutada ajutist muutujat väärtuste hoidmiseks. Näiteks

Vaheta kaks Numbers

Vahetuse üldised sammudping kaks numbrit on:

  • Deklareeri ajutine muutuja C
  • Määrake A väärtus C-le, mis tähendab, et C = A. Nüüd C = 20
  • Määrake B väärtus A-le, nii et A = 30
  • Määrake C väärtus B-le, nii et B = 20, kuna C väärtus on 20.

Nii vahetatakseping tehakse ajutise muutuja abil ja see töötab nii täis- kui ka ujukomaarvude puhul.

Vahetage aritmeetilise võrrandi abil

Nagu me teame, vahetameping tähendab kahe objekti, välja või muutuja sisu vahetamist. Vahetamine aritmeetilise tehte abil tähendab vahetuse sooritamist matemaatilise võrrandi, st liitmise ja asendamise abil.tracmise kohta.

Kui meile antakse kaks arvu ja palutakse need vahetada ilma ajutist muutujat kasutamata, siis saame kolme aritmeetilise võrrandi abil arvud vahetada.

Pseudokood vahetuse jaoksping numbrid aritmeetilise tehte abil:

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

Oletame, et meil on kaks arvu, A = 20 ja B = 30.

Tingimus 1: A = A+B

Seega on A praegune väärtus 20 + 30 = 50

Tingimus 2: B = AB

Nüüd B = 50-30 = 20
Näeme, et saime A väärtuse B-st.

Tingimus 3: A = AB

Lõpuks A = 50-20 = 30
A algväärtus on B.

Niisiis, me lihtsalt vahetasime numbreid.

Siin on programm kahe numbri vahetamiseks C-keeles.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);
}

Väljund:

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

Programm sisse 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))

Väljund:

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

Nüüd sisse Python, ei pea me isegi aritmeetilisi tehteid tegema. Me saame kasutada:

a,b = b,a

Siin on näide, kus a=20, b=30;

Vahetage aritmeetilise võrrandi abil

Vahetage Bitwise XOR-iga Operator

Seda meetodit tuntakse ka kui XOR-vahetust. XOR tähendab eksklusiivset VÕI. Selles bitipõhises operatsioonis võtame XOR-i sisenditeks kaks bitti. XOR-ist ühe väljundi saamiseks peab ainult üks sisend olema 1. Vastasel juhul on väljund 0. Järgmises tabelis on näidatud väljund kõigi sisendite A ja B kombinatsioonide korral.

Peame teadma, kuidas XOR-operatsioon töötab, et vahetada kahte arvu bitipõhiselt. Siin on XOR-operatsiooni tabel, kus A ja B on sisendväärtused.

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

Kui kahel sisendil on sama väärtus, annab XOR-operatsioon tulemuseks 0; vastasel juhul 1. Selles näites kasutame XOR-operatsiooni 3. Enamikus programmeerimiskeeltes tähistatakse XOR-i kui „^“.

Oletame, et A=4 (binaarselt = 0100) ja B=7 (binaarselt 0111).

Tingimus 1: A = A ^ B

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

Nüüd A = 0011 (binaarses vormis).

Tingimus 2: B = A^B

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

Seega B = 0100, mis oli A esialgne kahendväärtus.

Tingimus 3: A = A^B

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

Lõpuks A = 0111, mis oli B samaväärne kahendväärtus.

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

Väljund:

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

Programm sisse 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))

Väljund:

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

Vahetama Numbers kasutades bitiviisilist aritmeetikat

See meetod on sama mis aritmeetiline meetod, kuid liitmise ja osamaksete tegemiseks kasutame bitipõhiseid operatsioone, näiteks JA, VÕI ja täiendust.tracEnne sammude juurde asumist vaatame lühidalt üle mõiste „täiendus“.

1 täiend tähendab kõigi 0-de muutmist 1-ks ja 1-de muutmist 0-ks. Võtame näite.

  • Oletame arvu 23, mis on kümnendsüsteem.
  • Binaararvuks teisendamine annab tulemuseks 10111. Bite on ainult 5, aga arvuti salvestab numbreid 8, 16, 32, 64 … bitis. Seega lisame binaararvu ette nulli. See ei muuda arvu algset väärtust. Seega saab sellest 00010111.
  • Nagu me teame, tähendab 1 täiend kõigi 0-de muutmist 1-ks ja 1-de muutmist 0-ks, seega 1 täiendi sooritamine üle 00010111 annab 11101000.

Seda ühe täiendit esindab enamik programmeerimiskeeli sümbol „~”. Selle sümboli asetamine mis tahes täisarvu või ujukomaarvu ette annab ühe täiendi.

Ja 2 komplement tähendab binaarse “1” lisamist 1 täiendusele. Kui teeme ülaltoodud arvule 2 täienduse:

  • Binaarne = 00010111
  • 1 täiend = 11101000
  • 2-de täiend:

11101000

+ 1

11101001

Seega on 2 täiend 11101001. See on -23 binaar.
Kokkuvõttes näeb see arvu A täienduse esitamiseks välja järgmine:

2 täiendus A = (~A) + 1

Oletame nüüd, et A=8 (binaarne 00001000), B=10 (00001010)

Tingimus 1: A = (A ja B) + (A | B)

See on samaväärne A = A + B-ga.

A ja B = 00001000 ja 00001010 = 00001000

A | B = 00001000 | 00001010 = 00001010

Nüüd, 00001000 + 00001010 = 00010010 (18 koma)

Niisiis, A = 18

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

See on samaväärne B = AB-ga

Siin B = A – B

Eelnevast arutelust lähtuvalt, kui meil on vaja alamülesandeid täitatracSelleks teostame negatiivsele arvule kahega täiendi ja seejärel liidame selle.

Niisiis, -B = ~B + 1

Nüüd, B = 00010010 + (11110101) + 1 = 00001000

B väärtus on samaväärne kümnendkohaga 8, mis oli algväärtus.

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

See on samaväärne A = AB-ga

Nüüd A = 00010010 + 11110111 + 1

A = 00001010 (võrdne kümnendkohaga 10)

Lõpuks sai A B väärtuse. Seega vahetustehingping valmis.

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

Väljund:

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

Programm sisse 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))

Väljund:

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

Mis on aritmeetiline ületäitumine?

Mõiste "ületäitumine" tähendab piiri ületamist. Aritmeetiline ületäitumine tähendab, et mis tahes aritmeetilise tehte tulemus ületab arvuti arhitektuuri arvuesituse vahemikku või piiri. Näiteks kui arv jagatakse nulliga, muutub see lõpmatuks ja arvuti arvusüsteem ei saa seda 32- ega 64-bitises loendis hoida.

Täisarvude esitus

Täisarvude esitus 32-bitises süsteemis

Aritmeetilise ülevoolu tagajärg võib olla:

  • Kahe positiivse arvu liitmine muutub negatiivseks, sest märgibitt võib muutuda väärtuseks 1, mis tähendab negatiivset arvu.
  • Kahe negatiivse arvu liitmine muutub positiivseks, sest märgibitt võib muutuda nulliks, mis tähendab positiivset arvu.

KKK

XOR-vahetusping on intervjuu lemmik: pole lisamälu ega ületäitumist. Aritmeetika on hea varukoopia ja Python arendajad kirjutavad tavaliselt lihtsalt a, b = b, a.

Ei. Bitipõhine XOR töötab ainult täisarvuliste bitimustrite, mitte ujukomaarvude, topeltarvude ega pointerite puhul. Ujukarvude puhul kasutage hoopis tuuplite lahtipakkimist või aritmeetilist vahetust.

Kui mõlemad muutujad jagavad ühte mälupesa, toimub XOR vahetus.ping määrab väärtuseks 0. Lisa if-kontroll alati, kui aliasing on võimalik.

Jah: a = a * b, b = a / b, a = a / b. Kuid see ebaõnnestub, kui kumbki väärtus on 0 ja kaotab ujukomakoha täpsuse.

Ainult tuuplite lahtipakkimine saab seda teha. Kirjutades a, b = b, vahetab a stringe, loendeid või objekte. Aritmeetika ja XOR nipid on ainult täisarvulised.

Vaevalt. Kaasaegsed kompilaatorid optimeerivad juba ajutisi muutujaid sisaldavaid vahetusi, seega see nipp kiirust harva parandab. Readable kood on olulisem kui ühe muutuja salvestamine.

Jah. Masinõppe kood vahetab väärtusi Python paari lahtipakkimine ja tuim Indekseerimine nagu arr[[i, j]] = arr[[j, i]] vahetab massiivi read omavahel.

Jah. GitHub Copilot ja sarnased tehisintellekti assistendid loovad käsurealt XOR-i, aritmeetilisi ja tuple'i lahtipakkivaid vahetustehinguid. RevVaadake igaüks ületäitumise ja aliaseerimise vigade suhtes.

Võta see postitus kokku järgmiselt: