Αλλάξτε δύο αριθμούς χωρίς να χρησιμοποιήσετε τρίτη μεταβλητή: C, Python Πρόγραμμα
Στον προγραμματισμό, η εναλλαγή γλώσσας σημαίνει εναλλαγή της τιμής δύο μεταβλητών. Η μεταβλητή μπορεί να περιέχει έναν αριθμό, συμβολοσειρά, λίστα ή πίνακα, αντικείμενο κ.λπ. Ο γενικός τρόπος εναλλαγής είναι η χρήση μιας προσωρινής μεταβλητής για τη διατήρηση τιμών. Για παράδειγμα,
Τα γενικά βήματα για την εναλλαγή δύο αριθμών είναι:
- Δηλώθηκε μια προσωρινή μεταβλητή C
- Εκχωρήστε την τιμή του A στο C, που σημαίνει C = A. Τώρα C = 20
- Εκχωρήστε την τιμή του B στο A, οπότε A = 30
- Εκχωρήστε την τιμή του C στο B, οπότε B = 20, καθώς το C έχει την τιμή 20.
Έτσι γίνεται η ανταλλαγή με τη βοήθεια μιας προσωρινής μεταβλητής. Αυτή η μέθοδος θα λειτουργήσει τόσο για ακέραιους όσο και για float.
Ανταλλαγή χρησιμοποιώντας την Αριθμητική Εξίσωση
Όπως γνωρίζουμε, η εναλλαγή σημαίνει την ανταλλαγή του περιεχομένου δύο αντικειμένων ή πεδίων ή μεταβλητών. Εναλλαγή με χρήση αριθμητικής πράξης σημαίνει την εκτέλεση της πράξης ανταλλαγής χρησιμοποιώντας τη μαθηματική εξίσωση, δηλ. πρόσθεση και αφαίρεση.
Εάν μας δοθούν δύο αριθμοί και μας ζητηθεί να ανταλλάξουμε χωρίς να χρησιμοποιήσουμε μια προσωρινή μεταβλητή, τότε χρησιμοποιώντας τρεις αριθμητικές εξισώσεις, μπορούμε να ανταλλάξουμε τους αριθμούς.
Ψευδοκώδικας για εναλλαγή αριθμών με χρήση αριθμητικής πράξης:
A = A + B B = A - B A = A - B
Ας υποθέσουμε ότι έχουμε δύο αριθμούς, A = 20 και B = 30.
Συνθήκη 1: Α = Α+Β
Άρα, η τρέχουσα τιμή του Α είναι 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 σε αυτή τη λειτουργία bitwise. Για να λάβετε μία έξοδο από το XOR, μόνο μία είσοδος πρέπει να είναι 1. Διαφορετικά, η έξοδος θα είναι 0. Ο παρακάτω πίνακας δείχνει την έξοδο για όλους τους συνδυασμούς της εισόδου A B.
Πρέπει να γνωρίζουμε πώς λειτουργεί η λειτουργία XOR για να ανταλλάξουμε δύο αριθμούς χρησιμοποιώντας τη λειτουργία bitwise. Ακολουθεί ένας πίνακας για το XOR όπου τα Α και Β είναι τιμές εισόδου.
A | B | A XOR B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Εάν δύο είσοδοι έχουν την ίδια τιμή, τότε η λειτουργία XOR δίνει 0. διαφορετικά, 1. Για αυτό το παράδειγμα, θα χρησιμοποιήσουμε μια λειτουργία 3 XOR. Στις περισσότερες γλώσσες προγραμματισμού, το 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
Αυτή η μέθοδος είναι ίδια με την αριθμητική μέθοδο, αλλά θα χρησιμοποιήσουμε πράξεις Bitwise όπως AND, OR και Compliment για να εκτελέσουμε πρόσθεση και αφαίρεση. Πριν πάμε στα σκαλιά, ας δούμε γρήγορα το "Compliment".
Το συμπλήρωμα 1 σημαίνει να αλλάξουμε όλα τα 0 σε 1 και 1 σε 0. Ας έχουμε ένα παράδειγμα.
- Ας υποθέσουμε έναν αριθμό 23, έναν δεκαδικό αριθμό.
- Η μετατροπή σε δυαδικό δίνει τη χρήση 10111. Υπάρχουν μόνο 5 bit, αλλά ο υπολογιστής αποθηκεύει τον αριθμό σε 8,16,32,64 .. bit. Ας προσθέσουμε λοιπόν μηδέν μπροστά από το Binary. Δεν θα αλλάξει την αρχική τιμή του αριθμού. Έτσι θα γίνει 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
Ισοδυναμεί με Β = ΑΒ
Εδώ, Β = Α – Β
Από την παραπάνω συζήτηση, αν χρειαστεί να κάνουμε αφαίρεση, κάνουμε συμπλήρωμα 2 στον αρνητικό αριθμό και μετά τον προσθέτουμε.
Άρα, -B = ~B + 1
Τώρα, B = 00010010 + (11110101) + 1 = 00001000
Η τιμή του B είναι ισοδύναμη με το δεκαδικό 8, που ήταν η αρχική τιμή.
Συνθήκη 3: A = A + (~B) + 1
Ισοδυναμεί με Α = ΑΒ
Τώρα, A = 00010010 + 11110111 + 1
A = 00001010 (ισοδύναμο με δεκαδικό 10)
Τελικά το Α πήρε την τιμή του Β. Έτσι ολοκληρώθηκε η ανταλλαγή.
Πρόγραμμα σε 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.
Η συνέπεια της αριθμητικής υπερχείλισης μπορεί να είναι:
- Η πρόσθεση δύο θετικών αριθμών γίνεται αρνητική. Επειδή το bit πρόσημου μπορεί να γίνει 1, που σημαίνει αρνητικός αριθμός.
- Η πρόσθεση δύο αρνητικών αριθμών γίνεται θετική. Επειδή το bit πρόσημου μπορεί να γίνει 0, που σημαίνει θετικός αριθμός.