Python Πρόγραμμα για ανταλλαγή δύο αριθμών χωρίς τη χρήση τρίτης μεταβλητής

⚡ Έξυπνη Σύνοψη

ανταλλαγήςping Δύο αριθμοί χωρίς τρίτη μεταβλητή ανταλλάσσουν τις τιμές τους χρησιμοποιώντας αριθμητική πρόσθεση και υποδιαίρεση.tracση, ο τελεστής XOR κατά bit, ή αριθμητικά κόλπα κατά bit. Python μπορεί επίσης να ανταλλάξει απευθείας με αποσυσκευασία πλειάδων.

  • 🔘 Κλασική μέθοδος: Η συνήθης μέθοδος ανταλλαγής (swap) διατηρεί μία τιμή σε μια προσωρινή μεταβλητή, την οποία αυτές οι τεχνικές αποφεύγουν.
  • Αριθμητική εναλλαγή: Ανταλλάξτε τιμές με a = a + b, έπειτα b = a − b, έπειτα a = a − b.
  • 🔀 Εναλλαγή XOR: Εφαρμόστε τον τελεστή XOR ανά bit τρεις φορές για να ανταλλάξετε ακέραιους αριθμούς χωρίς υπερχείλιση.
  • 🧮 Αριθμητική bitwise: Χρησιμοποιήστε τους τελεστές AND, OR και συμπληρώματος για να αναπαράγετε την πρόσθεση και την υποδιαίρεση.tracσία.
  • 🐍 Python συντομώτερος δρόμος: Η αποσυσκευασία πλειάδων, a, b = b, a, ανταλλάσσει οποιεσδήποτε δύο τιμές σε μία γραμμή.
  • 🤖 Τεχνητή Νοημοσύνη και δεδομένα: Ανταλλαγές πλειάδων και αναδιάταξη στοιχείων πίνακα με ευρετηρίαση NumPy στην προετοιμασία μηχανικής μάθησης.

Ανταλλαγή δύο Numbers Χωρίς τη χρήση τρίτης μεταβλητής

Οι παρακάτω ενότητες καλύπτουν τέσσερις τρόπους εναλλαγής χωρίς προσωρινή μεταβλητή, καθώς και αριθμητική υπερχείλιση.

Στις γλώσσες προγραμματισμού, η ανταλλαγήping σημαίνει την ανταλλαγή τιμών δύο μεταβλητών. Η μεταβλητή μπορεί να περιέχει έναν αριθμό, μια συμβολοσειρά, μια λίστα ή έναν πίνακα, ένα αντικείμενο κ.λπ. Ο γενικός τρόπος ανταλλαγήςping είναι η χρήση μιας προσωρινής μεταβλητής για τη διατήρηση τιμών. Για παράδειγμα,

Ανταλλαγή δύο Numbers

Τα γενικά βήματα της ανταλλαγήςping δύο αριθμοί είναι:

  • Δηλώστε μια προσωρινή μεταβλητή C
  • Εκχωρήστε την τιμή του A στο C, που σημαίνει C = A. Τώρα C = 20
  • Εκχωρήστε την τιμή του B στο A, οπότε A = 30
  • Εκχωρήστε την τιμή του C στο B, οπότε B = 20, καθώς το C έχει την τιμή 20.

Έτσι είναι η ανταλλαγήping γίνεται με τη βοήθεια μιας προσωρινής μεταβλητής και λειτουργεί τόσο για ακέραιους όσο και για αριθμούς κινητής υποδιαστολής.

Ανταλλαγή χρησιμοποιώντας την Αριθμητική Εξίσωση

Όπως γνωρίζουμε, η ανταλλαγήping σημαίνει ανταλλαγή του περιεχομένου δύο αντικειμένων ή πεδίων ή μεταβλητών. Η ανταλλαγή χρησιμοποιώντας μια αριθμητική πράξη σημαίνει εκτέλεση της ανταλλαγής χρησιμοποιώντας μια μαθηματική εξίσωση, δηλαδή πρόσθεση και αφαίρεση.tracσία.

Αν μας δοθούν δύο αριθμοί και μας ζητηθεί να τους ανταλλάξουμε χωρίς να χρησιμοποιήσουμε μια προσωρινή μεταβλητή, τότε χρησιμοποιώντας τρεις αριθμητικές εξισώσεις, μπορούμε να ανταλλάξουμε τους αριθμούς.

Ψευδοκώδικας για ανταλλαγήping αριθμοί χρησιμοποιώντας μια αριθμητική πράξη:

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

Ας υποθέσουμε ότι έχουμε δύο αριθμούς, A = 20 και B = 30.

Συνθήκη 1: Α = Α+Β

Έτσι, η τρέχουσα τιμή του A είναι 20+30 = 50

Συνθήκη 2: Β = ΑΒ

Τώρα, Β = 50-30 = 20
Μπορούμε να δούμε ότι πήραμε την τιμή του Α στο Β.

Συνθήκη 3: Α = ΑΒ

Τέλος, Α = 50-20 = 30
Το Α έχει την αρχική τιμή του Β.

Έτσι, απλώς ανταλλάξαμε τους αριθμούς.

Εδώ είναι το πρόγραμμα για την ανταλλαγή δύο αριθμών σε 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);
}

Παραγωγή:

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

Πρόγραμμα στο 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))

Παραγωγή:

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

Τώρα σε Python, δεν χρειάζεται καν να εκτελέσουμε αριθμητικές πράξεις. Μπορούμε να χρησιμοποιήσουμε:

α,β = β,α

Ακολουθεί μια επίδειξη όπου a=20, b=30;

Ανταλλαγή χρησιμοποιώντας την Αριθμητική Εξίσωση

Εναλλάξτε χρησιμοποιώντας Bitwise XOR OperaTor

Αυτή η μέθοδος είναι επίσης γνωστή ως ανταλλαγή XOR. XOR σημαίνει αποκλειστικό OR. Λαμβάνουμε δύο bit ως εισόδους στο XOR σε αυτήν την λειτουργία ανά bit. Για να λάβουμε μία έξοδο από το XOR, μόνο μία είσοδος πρέπει να είναι 1. Διαφορετικά, η έξοδος θα είναι 0. Ο παρακάτω πίνακας δείχνει την έξοδο για όλους τους συνδυασμούς εισόδου A και B.

Πρέπει να γνωρίζουμε πώς λειτουργεί η λειτουργία XOR για την ανταλλαγή δύο αριθμών χρησιμοποιώντας τη λειτουργία bitwise. Ακολουθεί ένας πίνακας για το XOR όπου A και B είναι οι τιμές εισόδου.

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

Αν δύο είσοδοι έχουν την ίδια τιμή, τότε η λειτουργία XOR δίνει 0. Διαφορετικά, 1. Για αυτό το παράδειγμα, θα χρησιμοποιήσουμε μια λειτουργία XOR 3. Στις περισσότερες γλώσσες προγραμματισμού, το XOR συμβολίζεται ως "^".

Ας υποθέσουμε A=4 (σε Δυαδικό = 0100) και B=7 (σε Δυαδικό, 0111)

Συνθήκη 1: Α = Α ^ Β

A 0 1 0 0
B 0 1 1 1
Α ^ Β 0 0 1 1

Τώρα, A = 0011 (σε δυαδικό).

Συνθήκη 2: Β = Α^Β

A 0 0 1 1
B 0 1 1 1
Α ^ Β 0 1 0 0

Άρα B = 0100, που ήταν η αρχική δυαδική τιμή του A.

Συνθήκη 3: Α = Α^Β

A 0 0 1 1
B 0 1 0 0
Α ^ Β 0 1 1 1

Τέλος, A = 0111, που ήταν η ισοδύναμη δυαδική τιμή του B.

Πρόγραμμα σε 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);
}

Παραγωγή:

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

Πρόγραμμα στο 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))

Παραγωγή:

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

ανταλλαγής Numbers χρησιμοποιώντας Bitwise-Arithmetic

Αυτή η μέθοδος είναι η ίδια με την αριθμητική μέθοδο, αλλά θα χρησιμοποιήσουμε πράξεις bit όπως AND, OR και συμπλήρωμα για να εκτελέσουμε πρόσθεση και υποδιαίρεση.tracση. Πριν προχωρήσουμε στα βήματα, ας δούμε γρήγορα το «συμπλήρωμα».

Το συμπλήρωμα ως προς 1 σημαίνει ότι αλλάζουμε όλα τα 0 σε 1 και το 1 σε 0. Ας πάρουμε ένα παράδειγμα.

  • Ας υποθέσουμε ότι ο αριθμός 23 είναι ένας δεκαδικός αριθμός.
  • Η μετατροπή σε δυαδικό μας δίνει 10111. Υπάρχουν μόνο 5 bit, αλλά ο υπολογιστής αποθηκεύει αριθμούς σε 8, 16, 32, 64 … bit. Ας προσθέσουμε λοιπόν μηδέν μπροστά από το δυαδικό. Δεν θα αλλάξει η αρχική τιμή του αριθμού. Έτσι θα γίνει 00010111.
  • Όπως γνωρίζουμε, το συμπλήρωμα ως προς το 1 σημαίνει αλλαγή όλων των 0 σε 1 και του 1 σε 0, επομένως η εκτέλεση του συμπληρώματος ως προς το 1 πάνω από 00010111 δίνει 11101000.

Αυτό το συμπλήρωμα ως προς το 1 αναπαρίσταται με το σύμβολο "~" στις περισσότερες γλώσσες προγραμματισμού. Η τοποθέτηση αυτού του συμβόλου πριν από οποιεσδήποτε ακέραιες τιμές ή τιμές κινητής υποδιαστολής θα δώσει το συμπλήρωμα ως προς το 1.

Και το συμπλήρωμα του 2 σημαίνει την προσθήκη δυαδικού "1" στο συμπλήρωμα του 1. Αν κάνουμε συμπλήρωμα 2 στον παραπάνω αριθμό:

  • Δυαδικό = 00010111
  • Συμπλήρωμα ως προς 1 = 11101000
  • Συμπλήρωμα ως προς 2:

11101000

+ 1

11101001

Άρα, το συμπλήρωμα του 2 είναι 11101001. Αυτό είναι το Δυαδικό για -23.
Συνοπτικά, για την εκτέλεση του συμπληρώματος 2 ενός αριθμού Α, θα μοιάζει με:

Συμπλήρωμα 2 του A = (~A) + 1

Τώρα ας υποθέσουμε A=8 (δυαδικό 00001000), B=10 (00001010)

Συνθήκη 1: A = (A & B) + (A | B)

Είναι ισοδύναμο με A = A + B.

A & B = 00001000 & 00001010 = 00001000

A | B = 00001000 | 00001010 = 00001010

Τώρα, 00001000 + 00001010 = 00010010 (δεκαδικός αριθμός 18)

Άρα, Α = 18

Συνθήκη 2: B = A + (~B) + 1

Είναι ισοδύναμο με B = AB

Εδώ, Β = Α – Β

Από την παραπάνω συζήτηση, αν χρειαστεί να εκτελέσουμε υπο-tracση, εκτελούμε συμπλήρωμα ως προς 2 στον αρνητικό αριθμό και στη συνέχεια τον προσθέτουμε.

Άρα, -B = ~B + 1

Τώρα, Β = 00010010 + (11110101) + 1 = 00001000

Η τιμή του B είναι ισοδύναμη με το δεκαδικό 8, που ήταν η αρχική τιμή.

Συνθήκη 3: A = A + (~B) + 1

Είναι ισοδύναμο με A = AB

Τώρα, A = 00010010 + 11110111 + 1

A = 00001010 (ισοδύναμο με δεκαδικό 10)

Τελικά, ο Α πήρε την τιμή του Β. Έτσι, η ανταλλαγήping ολοκληρώθηκε.

Πρόγραμμα σε 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);
}

Παραγωγή:

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

Πρόγραμμα στο 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))

Παραγωγή:

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

Τι είναι η Αριθμητική Υπερχείλιση;

Ο όρος υπερχείλιση σημαίνει υπέρβαση του ορίου. Αριθμητική υπερχείλιση σημαίνει ότι το αποτέλεσμα οποιασδήποτε αριθμητικής πράξης υπερβαίνει το εύρος ή το όριο της αριθμητικής αναπαράστασης της αρχιτεκτονικής του υπολογιστή. Για παράδειγμα, εάν ένας αριθμός διαιρεθεί με το μηδέν, γίνεται άπειρος και το αριθμητικό σύστημα του υπολογιστή δεν μπορεί να τον χωρέσει σε 32 ή 64 bit.

Αναπαράσταση ακέραιου αριθμού

Αναπαράσταση ακέραιου αριθμού σε σύστημα 32 bit

Η συνέπεια της αριθμητικής υπερχείλισης μπορεί να είναι:

  • Η πρόσθεση δύο θετικών αριθμών γίνεται αρνητική, επειδή το bit πρόσημου μπορεί να γίνει 1, που σημαίνει αρνητικός αριθμός.
  • Η πρόσθεση δύο αρνητικών αριθμών γίνεται θετική, επειδή το bit πρόσημου μπορεί να γίνει 0, που σημαίνει θετικός αριθμός.

Συχνές Ερωτήσεις

Ανταλλαγή XORping είναι το αγαπημένο της συνέντευξης: χωρίς επιπλέον μνήμη, χωρίς υπερχείλιση. Η αριθμητική είναι ένα δίκαιο αντίγραφο ασφαλείας, και Python Οι προγραμματιστές συνήθως γράφουν απλώς a, b = b, a.

Όχι. Το Bitwise XOR λειτουργεί μόνο σε μοτίβα bit ακεραίων αριθμών, όχι σε κινητήρες κινητής υποδιαστολής, διπλάσιες υποδιαστολής ή δείκτες. Για κινητήρες κινητής υποδιαστολής, χρησιμοποιήστε την αποσυσκευασία πλειάδων ή την αριθμητική εναλλαγή.

Εάν και οι δύο μεταβλητές μοιράζονται μία θέση μνήμης, η XOR swapping ορίζει την τιμή σε 0. Προσθέστε ένα if check όποτε είναι δυνατή η δημιουργία ψευδωνύμων.

Ναι: a = a * b, b = a / b, a = a / b. Αλλά αποτυγχάνει όταν οποιαδήποτε από τις δύο τιμές είναι 0 και χάνει την ακρίβεια της κινητής υποδιαστολής.

Μόνο η αποσυσκευασία πλειάδων μπορεί να γίνει. Η σύνταξη a, b = b, a ανταλλάσσει συμβολοσειρές, λίστες ή αντικείμενα. Τα αριθμητικά κόλπα και τα κόλπα XOR είναι μόνο ακέραιοι αριθμοί.

Μόλις που. Οι σύγχρονοι μεταγλωττιστές βελτιστοποιούν ήδη τις προσωρινές αντικαταστάσεις μεταβλητών, επομένως το κόλπο σπάνια βελτιώνει την ταχύτητα. Readable Ο κώδικας έχει μεγαλύτερη σημασία από την αποθήκευση μίας μεταβλητής.

Ναι. Ο κώδικας μηχανικής μάθησης ανταλλάσσει τιμές με Python αποσυσκευασία πλειάδας, και μουδιασμένος Η δημιουργία ευρετηρίου όπως arr[[i, j]] = arr[[j, i]] ανταλλάσσει τις γραμμές του πίνακα στη θέση τους.

Ναι. Το GitHub Copilot και παρόμοιοι βοηθοί τεχνητής νοημοσύνης παράγουν XOR, αριθμητικές πράξεις και αντιγραφές πλειάδων από μια προτροπή. RevΕλέγξτε το καθένα για σφάλματα υπερχείλισης και ψευδωνύμων.

Συνοψίστε αυτήν την ανάρτηση με: