2 réponses
tyrtamos
Messages postés
4
Date d'inscription
samedi 4 mai 2013
Statut
Membre
Dernière intervention
6 mai 2013
2
6 mai 2013 à 09:08
6 mai 2013 à 09:08
Bonjour,
En exécutant ton code, j'ai surtout des erreurs de type: mélange de nombres et de chaînes de caractères.
Si je reprends ce que tu souhaites faire:
Les données de départ:
- les bases N et M doivent être des nombres: il faut donc convertir le résultat de input avec int()
- c, dans le cas général, doit être une chaîne de caractère (exemple: "01101001")
Pour convertir c en base 10 à partir de sa base N en appliquant ta formule, il ne faut pas prendre c[i] mais la valeur décimale du caractère c[i] dans la base N.
Il faut donc une chaîne de caractère représentant tous les caractères permis dans la base N, ici pour N=16:
chiffres = "0123456789ABCDEF"
et il faut chercher la valeur décimale des caractères en calculant leur indice. Par exemple, chiffres.find("B") donnera la valeur 11 (=indice de "B" dans la chaîne).
Corrigé comme ça, ça marche, mais en Python, il y a plus simple:
- on pourrait faire le calcul sans avoir à inverser l'ordre des caractères, et sans avoir à calculer de puissances
- plus simple encore, quelque soit la base de départ N (de 2 à 36), on peut convertir c en base 10 avec un simple c10 = int(c, N)
Voilà le petit code que je te propose, qui est valable, tant pour N que pour M, pour les bases de 2 à 36. J'ai complété ton code avec la conversion dans la base M:
En exécutant ton code, j'ai surtout des erreurs de type: mélange de nombres et de chaînes de caractères.
Si je reprends ce que tu souhaites faire:
Les données de départ:
- les bases N et M doivent être des nombres: il faut donc convertir le résultat de input avec int()
- c, dans le cas général, doit être une chaîne de caractère (exemple: "01101001")
Pour convertir c en base 10 à partir de sa base N en appliquant ta formule, il ne faut pas prendre c[i] mais la valeur décimale du caractère c[i] dans la base N.
Il faut donc une chaîne de caractère représentant tous les caractères permis dans la base N, ici pour N=16:
chiffres = "0123456789ABCDEF"
et il faut chercher la valeur décimale des caractères en calculant leur indice. Par exemple, chiffres.find("B") donnera la valeur 11 (=indice de "B" dans la chaîne).
Corrigé comme ça, ça marche, mais en Python, il y a plus simple:
- on pourrait faire le calcul sans avoir à inverser l'ordre des caractères, et sans avoir à calculer de puissances
- plus simple encore, quelque soit la base de départ N (de 2 à 36), on peut convertir c en base 10 avec un simple c10 = int(c, N)
Voilà le petit code que je te propose, qui est valable, tant pour N que pour M, pour les bases de 2 à 36. J'ai complété ton code avec la conversion dans la base M:
#!/usr/bin/python # -*- coding: utf-8 -*- # Python 3.2 N = int(input("Choisissez la base de départ : ")) c = input("Entrez le nombre à convertir : ") M = int(input("Choisissez dans quelle base convertir "+ c +" : ")) # chiffres permis dans les bases de numération de 2 à 36 chiffres = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" # conversion de c en base 10 => c10 (solution alternative: c10 = int(c, N)) c = c[::-1] #Inverse l'ordre des caractères dans la chaîne c10 = 0 for i in range(len(c)): c10 += chiffres.find(c[i])*N**i # conversion de c10 en base M if c10==0: result = "0" else: result = "" q = c10 while q!=0: q, r = divmod(q, M) result = chiffres[r] + result # affichage du résultat print("résultat:", result)