python afficher multiplication posée

Le challenge Python de l’été: écrire une multiplication posée

  • Dernière modification de la publication :23 juillet 2021
  • Temps de lecture :2 min de lecture
  • Commentaires de la publication :6 commentaires

Loading

Pour cet été, je vous propose un mini-challenge qui consiste à écrire un programme Python permettant d’afficher une multiplication posée.

Voici un exemple…

from math import log

def produit(a,b):
    m = max(a,b)
    longueur = int( log(m)/log(10) ) + 1
    
    result = [ a , b ]
    line = 0
    
    for i in range( int( log(b)/log(10) ) + 1 ):
        result.append( (b%10) * a * (10**line) )
        line +=1
        b = b // 10
    
    somme = 0
    for i in range(2,len(result)):
        somme += result[i]
    result.append(somme)
    
    longueur_affichage = int( log( result[-1] )/log(10) ) + 3
    formattage = '{:>'+str(longueur_affichage)+'}'
    formattage2 = '{:>'+str(longueur_affichage-2)+'}'
    
    r = ''
    
    for i in range( len(result) ):
        if (i == 2) or (i == len(result)-1):
            r += '-'*longueur_affichage + '\n'
            
        if i == 1:
            r += '× ' + formattage2.format( result[i] )
        else:
            r += formattage.format( result[i] )
        r += '\n'
        
    return r
>>> produit(9877,971)
     9877
×     971
---------
     9877
   691390
  8889300
---------
  9590567

Si vous souhaitez soumettre votre code, insérez-le dans votre commentaire sous la forme:

<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="dracula" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">
Votre code Python
</pre>

ceci afin qu’il s’affiche correctement. Il apparaîtra après validation manuelle de ma part.

5 1 vote
Évaluation de l'article
S’abonner
Notification pour
guest
6 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Nicolas Patrois

Le script est très moche mais il fait le boulot. C’est la multiplication posée mais par jalousies.

def chiffres(n):
    return [int(i) for i in str(n)]

def jalousies(n,m):
    p=n*m
    n=chiffres(n)
    m=chiffres(m)
    
    tableau="   | "+" | ".join(map(str,n))+" |   \n"
    
    for cm in m:
        tableau+="---"+"+---"*(len(n)+1)+"\n"
        ligne=" %s |"
        for cn in n:
            ch=chiffres(cn*cm)
            if len(ch)==1:
                ch=[0]+ch
            c="%d/%d|"%(ch[0],ch[1])
            c=c.replace("0"," ")
            ligne+=c
        ligne+=" %d \n"%cm
        tableau+=ligne
    tableau+="---"+"+---"*(len(n)+1)+"\n"
    p=list(map(str,chiffres(p)))
    p=["0"]*(len(m)+len(n)-len(p))+p
    tableau+=" "*3+"| %s "*len(n)+"|   "
    tableau=tableau%tuple(p)
    
    affichage="".join(map(str,n))+" × "+"".join(map(str,m))+"\n"
    affichage+=tableau+"\n"
    affichage+="".join(p).replace(" ","")
    
    return affichage
Nicolas Patrois

Oui, ici, je ne sais pas comment afficher le résultat ainsi.
Si on regarde bien, c’est la même que nous mais sans les retenues.

Nicolas Patrois

Sinon, voici mon script qui répond à la question, cette fois.

def multiposée(n,m):
  affichage=[" "+str(n)," "+str(m),"-"]
  for i,c in enumerate(str(m)[::-1]):
    affichage.append(" "+str(int(c)*n)+" "*i)
  affichage+=["-","  "+str(m*n)]
  l=len(affichage[-1])
  for i,e in enumerate(affichage):
    affichage[i]=e.rjust(l,e[0])
  affichage[1]="×"+affichage[1][1:]
  return "\n".join(affichage)
Nicolas Patrois

On peut obtenir la longueur d’un entier en le convertissant en une chaîne de caractères et de même, on peut obtenir ses chiffres.
Sinon, la ruse est dans le fait d’avoir utilisé la méthode rjust (qui pousse à droite, ljust pousse à gauche) avec un caractère de remplissage posé dès la création de chaque ligne au début de chacune d’elles.
Python accepte les noms accentués (utf8), je ne me prive pas de les utiliser.