Python Programma per scambiare due numeri senza utilizzare una terza variabile

⚡ Riepilogo intelligente

scambiareping due numeri senza una terza variabile scambiano i loro valori sul posto usando l'addizione aritmetica e la sottrazionetraczione, l'operatore XOR bit a bit, o trucchi di aritmetica bit a bit. Python è possibile anche effettuare lo scambio direttamente tramite l'estrazione della tupla.

  • 🔘 Metodo classico: Lo scambio tradizionale memorizza un valore in una variabile temporanea, cosa che queste tecniche evitano.
  • Scambio aritmetico: Scambia i valori con a = a + b, poi b = a − b, poi a = a − b.
  • 🔀 Scambio XOR: Applica l'operatore XOR bit a bit tre volte per scambiare gli interi senza overflow.
  • 🧮 Aritmetica bit a bit: Utilizzare gli operatori AND, OR e complemento per riprodurre addizione e sottrazionetraczione.
  • 🐍 Python scorciatoia: L'operazione di scomposizione di una tupla, a, b = b, a, scambia due valori qualsiasi in una riga.
  • 🤖 Intelligenza artificiale e dati: Lo scambio di tuple e l'indicizzazione NumPy riordinano gli elementi degli array nella preparazione all'apprendimento automatico.

Scambia due Numbers Senza utilizzare una terza variabile

Le sezioni seguenti illustrano quattro metodi per effettuare scambi senza utilizzare una variabile temporanea, oltre al problema dell'overflow aritmetico.

Nei linguaggi di programmazione, lo scambioping significa scambiare i valori di due variabili. La variabile può contenere un numero, una stringa, una lista o un array, un oggetto, ecc. Il modo generale di scambioping consiste nell'utilizzare una variabile temporanea per memorizzare i valori. Ad esempio,

Scambia due Numbers

Le fasi generali dello scambioping due numeri sono:

  • Dichiarare una variabile temporanea C
  • Assegna il valore di A a C, ovvero C = A. Ora C = 20
  • Assegna il valore di B ad A, quindi A = 30
  • Assegna il valore di C a B, quindi B = 20, poiché C ha il valore 20.

Ecco come si scambiaping Questo viene fatto con l'aiuto di una variabile temporanea e funziona sia per numeri interi che per numeri decimali.

Scambia utilizzando l'equazione aritmetica

Come sappiamo, lo scambioping significa scambiare il contenuto di due oggetti, campi o variabili. Scambiare usando un'operazione aritmetica significa eseguire lo scambio usando un'equazione matematica, cioè addizione e sottrazione.traczione.

Se ci vengono dati due numeri e ci viene chiesto di scambiarli senza usare una variabile temporanea, allora possiamo scambiarli utilizzando tre equazioni aritmetiche.

Pseudocodice per lo scambioping numeri utilizzando un'operazione aritmetica:

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

Supponiamo di avere due numeri, A = 20 e B = 30.

Condizione 1: A = A+B

Quindi, il valore attuale di A è 20+30 = 50

Condizione 2: B = AB

Ora, B = 50-30 = 20
Possiamo constatare di aver ottenuto il valore di A in B.

Condizione 3: A = AB

Infine, A = 50-20 = 30
A ha il valore iniziale di B.

Quindi abbiamo semplicemente scambiato i numeri.

Ecco il programma per scambiare due numeri 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);
}

Produzione:

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

Produzione:

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

Ora in Python, non abbiamo nemmeno bisogno di eseguire operazioni aritmetiche. Possiamo usare:

a,b = b,a

Ecco una dimostrazione in cui a=20, b=30;

Scambia utilizzando l'equazione aritmetica

Scambio tramite XOR bit a bit Operator

Questo metodo è anche noto come scambio XOR. XOR significa OR esclusivo. In questa operazione bit a bit, utilizziamo due bit come input per l'operazione XOR. Per ottenere un output dall'operazione XOR, è sufficiente che uno solo degli input sia 1. Altrimenti, l'output sarà 0. La tabella seguente mostra l'output per tutte le combinazioni di input A e B.

Dobbiamo capire come funziona l'operazione XOR per scambiare due numeri utilizzando l'operazione bit a bit. Ecco una tabella per l'operazione XOR, dove A e B sono i valori di input.

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

Se due input hanno lo stesso valore, l'operazione XOR restituisce 0; altrimenti, 1. In questo esempio, utilizzeremo un'operazione XOR a 3. Nella maggior parte dei linguaggi di programmazione, l'operazione XOR è indicata con il simbolo "^".

Supponiamo che A=4 (in binario = 0100) e B=7 (in binario, 0111)

Condizione 1: A = A^B

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

Ora, A = 0011 (in binario).

Condizione 2: B = A^B

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

Quindi B = 0100, che era il valore binario iniziale di A.

Condizione 3: A = A^B

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

Infine, A = 0111, che era il valore binario equivalente di B.

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

Produzione:

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

Produzione:

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

scambiare Numbers utilizzando l'aritmetica bit a bit

Questo metodo è lo stesso del metodo aritmetico, ma useremo operazioni bit a bit come AND, OR e complemento per eseguire addizioni e sottrazioni.tracPrima di passare ai passaggi, diamo una rapida occhiata al concetto di "complemento".

Il complemento a uno significa trasformare tutti gli 0 in 1 e tutti gli 1 in 0. Facciamo un esempio.

  • Supponiamo di considerare il numero 23 come un numero decimale.
  • La conversione in binario ci dà 10111. Ci sono solo 5 bit, ma il computer memorizza i numeri in 8, 16, 32, 64... bit. Quindi aggiungiamo uno zero davanti al binario. Questo non cambierà il valore originale del numero. Quindi diventerà 00010111.
  • Come sappiamo, il complemento a 1 significa cambiare tutti gli 0 in 1 e tutti gli 1 in 0, quindi eseguire il complemento a 1 su 0001011111101000.

Il complemento a uno è rappresentato dal simbolo "~" nella maggior parte dei linguaggi di programmazione. Anteponendo questo simbolo a qualsiasi valore intero o a virgola mobile si ottiene il complemento a uno.

E complemento a 2 significa aggiungere “1” binario al complemento a 1. Se facciamo il complemento a 2 al numero sopra:

  • Binario = 00010111
  • Complemento a 1 = 11101000
  • Complemento a due:

11101000

+ 1

11101001

Quindi, il complemento a 2 è 11101001. Questo è il binario per -23.
In sintesi, per eseguire il complemento a 2 di un numero A, sarà simile a:

Complemento a 2 di A = (~A) + 1

Ora supponiamo che A=8 (binario 00001000), B=10 (00001010)

Condizione 1: A = (A e B) + (A | B)

È equivalente a A = A + B.

A e B = 00001000 e 00001010 = 00001000

A | B = 00001000 | 00001010 = 00001010

Ora, 00001000 + 00001010 = 00010010 (decimale 18)

Quindi A = 18

Condizione 2: B = LA + (~B) + 1

È equivalente a B = AB

Qui, B = A – B

Dalla discussione precedente, se dobbiamo eseguire un subtracIn questo caso, eseguiamo il complemento a due del numero negativo e poi lo aggiungiamo.

Quindi, -B = ~B + 1

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

Il valore di B è equivalente al decimale 8, che era il valore iniziale.

Condizione 3: LA = LA + (~B) + 1

È equivalente ad A = AB

Ora, A = 00010010 + 11110111 + 1

A = 00001010 (equivalente a 10 decimale)

Infine, A ha ottenuto il valore di B. Quindi, lo scambioping è stato completato.

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

Produzione:

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

Produzione:

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

Che cos'è l'overflow aritmetico?

Il termine overflow significa superamento del limite. L'overflow aritmetico si verifica quando il risultato di un'operazione aritmetica supera l'intervallo o il limite della rappresentazione numerica dell'architettura del computer. Ad esempio, se un numero viene diviso per zero, diventa infinito e il sistema numerico del computer non può rappresentarlo con 32 o 64 bit.

Rappresentazione dei numeri interi

Rappresentazione di numeri interi in un sistema a 32 bit

La conseguenza dell'overflow aritmetico può essere:

  • La somma di due numeri positivi dà come risultato un numero negativo, perché il bit di segno potrebbe diventare 1, ovvero un numero negativo.
  • La somma di due numeri negativi dà come risultato un numero positivo, perché il bit di segno potrebbe diventare 0, indicando quindi un numero positivo.

DOMANDE FREQUENTI

scambio XORping è il preferito per i colloqui: nessuna memoria extra, nessun overflow. L'aritmetica è un buon backup e Python Gli sviluppatori di solito scrivono semplicemente a, b = b, a.

No. L'operazione XOR bit a bit funziona solo con sequenze di bit interi, non con numeri in virgola mobile, double o puntatori. Per i numeri in virgola mobile, utilizzare invece l'unpacking di tuple o lo scambio aritmetico.

Se entrambe le variabili condividono una posizione di memoria, scambio XORping Imposta il valore a 0. Aggiungi un controllo if ogni volta che è possibile l'aliasing.

Sì: a = a * b, b = a / b, a = a / b. Ma fallisce quando uno dei valori è 0 e perde la precisione in virgola mobile.

Solo l'unpacking delle tuple è possibile. Scrivere a, b = b, a scambia stringhe, liste o oggetti. I trucchi aritmetici e XOR sono validi solo per i numeri interi.

A malapena. I compilatori moderni ottimizzano già lo scambio di variabili temporanee, quindi questo trucco raramente migliora la velocità. Readable Il codice è più importante del salvataggio di una singola variabile.

Sì. Il codice di apprendimento automatico scambia i valori con Python disimballaggio della tupla e NumPy L'indicizzazione come arr[[i, j]] = arr[[j, i]] scambia le righe dell'array sul posto.

Sì. GitHub Copilot e assistenti IA simili producono scambi XOR, aritmetici e di decompressione di tuple a partire da un input. RevEsaminare ciascuna per individuare bug di overflow e aliasing.

Riassumi questo post con: