Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
Discussion fermée
#1 15-03-2016 15:54:59
- fahdi07
- Membre
- Inscription : 15-03-2016
- Messages : 1
Calculs Binaire
Slt
Suis debutant dans le monde de la programmation et j'aurais besoin de votre aide en ce qui concerne les calculs Binaire.
Tout d'abord comment transformer les bases 10 en base 2 et et vice-versa.
genre on me donne un nombre comme ce-ci :
2016 que je dois transformer en base 2. comment proceder?
mrc d'avance
Hors ligne
#2 15-03-2016 21:35:14
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 944
Re : Calculs Binaire
Bonsoir,
Rapidement, écrire un nombre en base 10, c'est faire des paquets de dix, puis de dix fois dix, puis...etc...
L'écrire en base deux c'est faire des paquets de deux, puis de deux fois deux, puis...etc...
(Désolé, je viens de passer 5 h aux Urgences où j'ai emmené ma mère, je suis un peu cuit ce soir
A la main :
2016 | 2
0 |---
|1008 | 2
0 |---
| 504 | 2
0 |---
| 252 | 2
0 |------
| 126 | 2
0 |-----
| 63 | 2
1 |---
| 31 | 2
1 |---
| 15 | 2
1 |---
| 7 | 2
1 |---
| 3 | 2
1 |---
| 1 --> ET là, tu tiens ton test d'arrêt
Tu as besoin d'une boucle While (TANT_QUE avec AlgoBox)
Il te faut partir du nombre 2016
Faire les divisions successives par 2.
stocker le reste et le quotient entier dans deux variables distinctes à chaque itération
disposer d'un compteur qui démarre à 0 par exemple appelé cpt...
Tu as besoin d'une variable pour construire ton nombre par ex nb_converti.
Pour juxtaposer les restes dans le bon ordre, il faut les écrire l'un à côté de l'autre, soit à chaque tour, mettre dans nb_converti son ancienne valeur à qui on ajoute le reste obtenu multiplié par [tex]10^{cpt}[/tex]
Et on incrémente le compteur de 1 :cpt=cpt+1
La boucle While +condition est
While q >1 (TANT QUE q >1 FAIRE ce qui suit)
A la sortie de ta boucle, si justement tu en es sorti c'est que q=1
Il te reste donc un dernier calcul qui s'écrit
[tex]nb\_converti=nb\_converti+q\times 10^{cpt}[/tex]
Là, je peux plus, je reprends demain en Python et avec AlgoBox.
Quel langage veux-tu utiliser ?
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
#3 16-03-2016 11:06:01
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 944
Re : Calculs Binaire
Bonjour,
Voilà de la programmation basique en Python :
# -*- coding: utf8 -*-
nb_depart=215
base = 2
nb_converti=0
cpt=0
q,r=nb_depart,0
while q>base-1:
q,r=q//base,q%base
nb_converti=nb_converti+r*10**cpt
cpt=cpt+1
nb_converti=nb_converti+q*10**cpt
print ("nombre converti :",nb_converti)
Qui me donne en sortie :
nombre converti : 11010111
En replaçant 215 par 20015 :
nombre converti : 100111000101111
Le même code écrit avec AlgoBox :
nb_converti EST_DU_TYPE NOMBRE
base EST_DU_TYPE NOMBRE
cpt EST_DU_TYPE NOMBRE
q EST_DU_TYPE NOMBRE
r EST_DU_TYPE NOMBRE
nb_depart EST_DU_TYPE NOMBRE
DEBUT_ALGORITHME
nb_converti PREND_LA_VALEUR 0
base PREND_LA_VALEUR 2
cpt PREND_LA_VALEUR 0
nb_depart PREND_LA_VALEUR 215
q PREND_LA_VALEUR nb_depart
r PREND_LA_VALEUR 0
TANT_QUE (q>base-1) FAIRE
DEBUT_TANT_QUE
r PREND_LA_VALEUR q%base
q PREND_LA_VALEUR floor(q/base)
nb_converti PREND_LA_VALEUR nb_converti+r*pow(10,cpt)
cpt PREND_LA_VALEUR cpt+1
FIN_TANT_QUE
nb_converti PREND_LA_VALEUR nb_converti+q*pow(10,cpt)
AFFICHER "Le nombre converti est : "
AFFICHER nb_converti
FIN_ALGORITHME
AlgoBox est un langage basique proche du pseudo-code : il ne connaît pas pas par exemple le quotient entier : je suis obligé de prendre la partie entière du quotient calculé.
En Python, je dispose déjà (écrit, il y a un certain temps) d'un code bien plus évolué qui convertit n'importe quel entier d'une base X vers une base Y, X et y étant compris entre 2 et 36 inclus.
# -*- coding: utf8 -*-
from math import log
from time import clock
def choixbase(es,b1):
# Cette même fonction sert pour les deux bases.
ok,supp=0,"de départd'arrivée"
while not ok:
bs=input("Entrer la base "+supp[es:es+9]+" (entre 2 et 36) : ")
try:
bsn=int(bs)
if bsn<2 or bsn>36:
print ("Désolé, valeur hors limite. Veuillez recommencer S.V.P.\n")
else:
if es==9 and bsn==b1:
print ("Désolé, Les bases sont les mêmes. Veuillez recommencer S.V.P.\n")
else:
ok=1
except ValueError:
print ("Désolé, ceci n'est pas un nombre. Veuillez recommencer S.V.P.\n")
return bsn
def choixdunombre(b):
ok=0
while not ok:
nb=input("Entrer le nombre à convertir : ").upper()
chfr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'[:b]
for car in nb:
if car not in chfr:
print ('Désolé, '+car+' n\'existe pas en base '+str(b)+'. Veuillez recommencer, S.V.P\n')
break
else:
ok=1
return nb
def versdix(s,b):
l,nb,s=len(s),0,s[::-1]
chfr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in range(l):
nb+=chfr.find(s[i])*b**i
return nb
def versbase(nbcr,b):
nb,nbdiv='',int(log(nbcr)//log(b))+1
chfr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in range(nbdiv):
nbcr,r=nbcr//b,nbcr%b
nb=chfr[r]+nb
return nb
print (" ******************************************")
print (" * Conversion d'un nombre *")
print (" * d'une base X vers une base Y *")
print (" ******************************************\n\n")
base_depart=choixbase(0,0)
nb=choixdunombre(base_depart)
base_arrivee=choixbase(9,base_depart)
# Affichage des données
print('\n Le nombre')
print (' '+nb)
print (' écrit en base',base_depart)
tp_d=clock()
# Calculs
if base_depart!=10:
nb_converti=versdix(nb,base_depart)
else:
nb_converti=int(nb)
if base_arrivee !=10:
reponse=versbase(nb_converti,base_arrivee)
else:
reponse=str(nb_converti)
#Affichage de la réponse et du temps de calcul
print ('\n s\'écrit')
print (' '+reponse)
print (' en base '+str(base_arrivee))
print ('\nDurée du calcul :',clock()-tp_d,"s")
Exemple de sortie :
******************************************
* Conversion d'un nombre *
* d'une base X vers une base Y *
******************************************
Entrer la base de départ (entre 2 et 36) : 10
Entrer le nombre à convertir : 204037
Entrer la base d'arrivée (entre 2 et 36) : 16
Le nombre
204037
écrit en base 10
s'écrit
31D05
en base 16
Durée du calcul : 0.008870959856629824 s
Explications sur demande.
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
Pages : 1
Discussion fermée