Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Πως μπορουμε να μετατρεψουμε εναν αριθμό από βάση α σε βάση β? Μπορει καποιος να με βοηθησει και να μου πει εναν αλγοριθμο για την c++? Οι βασεις α και β μπορει να ειναι ειτε η 2 ειτε η 8 ειτε η 10 ειτε η 16. Ευχαριστω!

Δημοσ.

Δεν σας έχουν δείξει στην σχολή πως γίνεται μετατροπή μεταξύ συστημάτων; Στο google το έψαξες; Γεμάτο παραδείγματα είναι παντού.

Δημοσ.

Πρεπει να το σπασουμε σε κατηγοριες? Δηλ. Αν απο 2 σε 8, αν απο 2 σε 10, αν απο 10 σε 2 κτλ?

 

Δεν έχει καμία διαφορά στον αλγόριθμο το αν κάνεις μετατροπή από 2 σε 8 ή από 57 σε 13 ή οτιδήποτε άλλο.

 

Θα σε συμβούλευα να μάθεις να κάνεις μετατροπή manually με μολύβι και χαρτί, δεν είναι δύσκολο. Απλά θέλει να κάτσεις λίγο να σκεφτείς τι κάνεις. Και μετά, έχοντας γνώση του τι ακριβώς κάνεις, είναι εύκολο και να τα μεταφέρεις σε πρόγραμμα.

Δημοσ.

Κοιτώντας διάφορους αλγόριθμους γι αυτό το πρόβλημα έπεσα πάνω σε έναν που μετατρέπει αριθμό από μία βάση στο 10δικό

 

η υλοποίηση του σε python είναι  έτσι

def fromDigits(digits, :
    n = 0
    for d in digits:
        n = b * n + d
    return n

και μαγικά 

fromDigits([1,1,2,0],3) 
>>>42

Δεν κάνει δηλαδή το κλασικό 0*3^0 +2*3^1+... αλλά το παραπάνω και δουλεύει

  :cry:  

Δημοσ.

Κοιτώντας διάφορους αλγόριθμους γι αυτό το πρόβλημα έπεσα πάνω σε έναν που μετατρέπει αριθμό από μία βάση στο 10δικό

 

η υλοποίηση του σε python είναι  έτσι

def fromDigits(digits, :
    n = 0
    for d in digits:
        n = b * n + d
    return n

και μαγικά 

fromDigits([1,1,2,0],3) 
>>>42
Δεν κάνει δηλαδή το κλασικό 0*3^0 +2*3^1+... αλλά το παραπάνω και δουλεύει

  :cry:

 

Δεν είναι ο κλασικός 0*3^0+κτλ που ανέφερες και που θα έπρεπε να σκεφτεί με κλειστά μάτια ο OP (από το δημοτικό ακόμη το μάθαμε αυτό απλά αντί να ξέρουμε βάσεις και δυνάμεις λέγαμε μονάδες, δεκάδες, εκατοντάδες) αλλά και αυτός είναι ένας από τους κλασικούς τρόπους. Είναι σαν να κάνεις shift τα ψηφία.

 

def fromDigits(digits, :
    n = 0
    for d in digits:
        n = b * n
        n = n + d
    return n

fromDigits([1,1,2,0],10) 
Για να γίνει πιο κατανοητό στον OP το έσπασα σε δύο δηλώσεις και άλλαξα την βάση που είχες σε 10.

 

Έχουμε n = 10 * 0 (επειδή αρχικά το n είναι 0) και μετά προσθέτουμε το 1ο ψηφίο που είναι το 1 οπότε έχουμε 1.

 

Στο επόμενο στάδιο έχουμε n = 10 * 1 δηλαδή επειδή πολλαπλασιάζουμε με την βάση, σύραμε το ψηφίο μας κατά μία θέση και από τις "μονάδες" πήγε στις "δεκάδες". Μετά προσθέτουμε το επόμενο ψηφίο και γίνεται 11.

 

Και ούτω καθεξής, το 11 θα πολλαπλασιαστεί με το 10 και θα γίνει 110 (οπότε τα ψηφία μας σύρονται κατά μία θέση) και προσθέτουμε το ψηφίο 2 οπότε γίνεται 112 και τέλος στο επόμενο στάδιο γίνεται 1120.

 

Δηλαδή πόσο πια βαριέται κάποιος να σκεφτεί και δεν βρήκε τον τρόπο του δημοτικού ? Σε λίγο κάποιος θα ζητήσει κώδικα c++ που να υπολογίζει το παραγοντικό.

Δημοσ.

Πρόσφατα καθώς "έπαιζα" λίγη C++ έκανα αυτό το παράδειγμα:

#include <iostream>
#include <bitset>
using namespace std;

const char RED[8]="\033[0;31m";
const char GREEN[8]="\033[0;32m";
const char YELLOW[8]="\033[0;33m";
const char NO_COLOR[7]="\033[0m";

int main()
{
  unsigned int x,originalNumber; // A normal integer
  unsigned char *p; // A pointer to an integer
  unsigned char lower_byte;
  p = (unsigned char *)&x; // Read it, "assign the address of x to p"
  cout<<"Please enter a number: "<<endl;
  cin>> x; // Put a value in x, we could also use *p here
  cin.ignore();

  originalNumber=x; //Saving the oroginal Value
  lower_byte=*p;
  *p=~*p; //inverting the first byte

  cout<< "Original Number: "<<GREEN<<std::bitset<32>(originalNumber)<<NO_COLOR<<"("<<RED<<originalNumber<<NO_COLOR<<")"<<endl;
  cout<< "Lower Byte Number: "<<GREEN<<std::bitset<32>(lower_byte)<<NO_COLOR<<"("<<RED<<(unsigned int)lower_byte<<NO_COLOR<<")"<<endl;
  cout<< "Modified Number: "<<GREEN<<std::bitset<32>(x)<<NO_COLOR<<"("<<RED<<x<<NO_COLOR<<")"<<endl;
  cin.get();
}

Ίσως η βιβλιοθήκη bitset να έχει αυτό ποθ επιθυμείς.

 

(Βασικά προσπαθούσα να αντιστρέψω  δυαδικά τα πρώτα 8bit ενός integer αριθμού έτσι για δοκιμή.)

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...