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 05-07-2020 20:55:07
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 16 910
[Python] Méthode de multiplication dite "multiplication arabe"
Bonsoir,
#!/usr/bin/env python
# -*- coding: utf-8 -*-
while True:
#######################
x,y=39854,684729
####################
x,y=min(x,y),max(x,y)
# préparation puis unversion des listes d'entiers
xx=str(x)
if len(xx) >11:
print ("Le plus petit des 2 nombres ne doit pas dépasser 12 chiffres, afin de conserver un")
print ("affichage cohérent. Veuillez modifier votre choix s'il vous plaît...")
print ("\n")
else:
break
print ("\n MULTIPLICATION ARABE\n\n")
print ("Multiplication de",x,"par",y)
X,Y,Prod=[int(i) for i in str(x)][::-1],[int(i) for i in str(y)][::-1],[]
print("\nLes chiffres de", y,"sont écrits de bas en haut, ceux de", xx,"de gauche à droite.")
print("Tracer les diagonales de chaque case carrée.")
lgx,lgy=len(X),len(Y)
nbc,tot=lgx+lgy,lgx*2
Res=[[0]*nbc for i in range(tot)]
#Je remplis mon tableau
for ligne,nbp in enumerate(X):
lgn_p,lgn_i=ligne*2,ligne*2+1
for col,nbq in enumerate(Y):
c=col+ligne
Res[lgn_i][c+1],Res[lgn_p][c]=divmod(nbq*nbp,10)
# Je somme les colonnes et reporte les retenues
ret,s=0,0
for i in zip(*Res):
s=ret+sum(i)
ret,u=divmod(s,10)
Prod.append(u)
Prod.reverse()
Prd=[str(chf) for chf in Prod]
lg_prod=len(Prod)
#print(Prod,x*y)
U,U_u,D,D_d, pr=[],[],[],[],len(Prod)-1
H0=[" "+str(i) for i in xx]
H=[int(i)for i in xx]
V=[int(i)for i in Y]
for i in V:
for j in H:
q,r=divmod(i*j, 10)
U_u.append(r)
D_d.append(q)
U.append(U_u)
D.append(D_d)
U_u,D_d=[],[]
print((" |"), end=" ")
for c in H0:
print (str(c),end=" | ")
print()
IL='--|'+'-----|'*lgx
print(IL+"--")
for i in range(lgy):
print(' |', end="")
for elem in U[i]:
print(' \\ '+str(elem)+' |',end="")
print()
print(str(Y[i])+' |', end="")
for elem in D[i]:
print(str(elem)+' \\ |',end="")
print(Prod[pr])
print(IL+"--")
pr-=1
print(" | ", end="")
for i in range(lgx):
print(str(Prod[i])+" | ",end="")
print("\n")
print ("Effectuer les",lgx,"x",lgy,"=", lgx*lgy,"multiplications.")
print ("Inscrire dans le coin")
print ("* inférieur gauche de chaque case, le chiffre des dizaines (0 si dizaines absentes),")
print ("* supérieur droit de chaque case, le chiffre des unités.")
print ("\nLes multiplications une fois effectuées, vient le temps des additions...")
print ("De droite à gauche, addditionner tous les chiffres de chaque diagonale.")
print ("N'inscrire que le chiffre des unités, reporter celui des dizaines en retenue dans la")
print ("diagonale suivante.")
print ("Le résultat se lit de G à D en partant de la dernière ligne, puis de bas en haut...")
print (" ",x,"x",y,"=","".join(Prd))
Sortie :
MULTIPLICATION ARABE
Multiplication de 39854 par 684729
Les chiffres de 684729 sont écrits de bas en haut, ceux de 39854 de gauche à droite.
Tracer les diagonales de chaque case carrée.
| 3 | 9 | 8 | 5 | 4 |
--|-----|-----|-----|-----|-----|--
| \ 7 | \ 1 | \ 2 | \ 5 | \ 6 |
9 |2 \ |8 \ |7 \ |4 \ |3 \ |6
--|-----|-----|-----|-----|-----|--
| \ 6 | \ 8 | \ 6 | \ 0 | \ 8 |
2 |0 \ |1 \ |1 \ |1 \ |0 \ |6
--|-----|-----|-----|-----|-----|--
| \ 1 | \ 3 | \ 6 | \ 5 | \ 8 |
7 |2 \ |6 \ |5 \ |3 \ |2 \ |5
--|-----|-----|-----|-----|-----|--
| \ 2 | \ 6 | \ 2 | \ 0 | \ 6 |
4 |1 \ |3 \ |3 \ |2 \ |1 \ |9
--|-----|-----|-----|-----|-----|--
| \ 4 | \ 2 | \ 4 | \ 0 | \ 2 |
8 |2 \ |7 \ |6 \ |4 \ |3 \ |8
--|-----|-----|-----|-----|-----|--
| \ 8 | \ 4 | \ 8 | \ 0 | \ 4 |
6 |1 \ |5 \ |4 \ |3 \ |2 \ |1
--|-----|-----|-----|-----|-----|--
| 2 | 7 | 2 | 8 | 9 |Effectuer les 5 x 6 = 30 multiplications.
Inscrire dans le coin
* inférieur gauche de chaque case, le chiffre des dizaines (0 si dizaines absentes),
* supérieur droit de chaque case, le chiffre des unités.Les multiplications une fois effectuées, vient le temps des additions...
De droite à gauche, additionner tous les chiffres de chaque diagonale.
N'inscrire que le chiffre des unités, reporter celui des dizaines en retenue dans la
diagonale suivante.
Le résultat se lit de G à D en partant de la dernière ligne, puis de bas en haut...
39854 x 684729 = 27289189566
@+
Arx Tarpeia Capitoli proxima...
Hors ligne
Pages : 1
Discussion fermée