You enter 1 or 2 numbers and this program calculates a lot of things for you, such as whether the numbers are prime, their divisors, the decomposition into prime factors, etc… Useful when you’re in 3rd grade.
from math import * from ion import * from kandinsky import * # Innitialisation des couleur utilisees: # Vous pouvez les modifier si vous voulez. # 1) Couleur du fond ----- Noir c_fond = (0,0,0) # 2) Couleur des nombres - Cyan c_nombre = (0,255,255) # 3) Couleur du texte ---- Bleu clair c_texte = (0,150,255) def recup_nombres(): Nombre_a_ecrire,augmenter,y,R="Nombre 1 (obligatoire):",True,0,0 fill_rect(0,0,320,222,c_fond) for i in range(2): n=[] draw_string(Nombre_a_ecrire,0,y,c_texte,c_fond) draw_string("_",230,y,c_nombre,c_fond) while not (((keydown(KEY_OK) or keydown(KEY_EXE)) and len(n)>0) or ((keydown(KEY_OK) or keydown(KEY_EXE)) and i==1)): if R>249:augmenter=False elif R<2:augmenter=True if augmenter==True:R+=2 else:R-=5 draw_string("|USE NUMBERS KEYS|",70,130,(R,0,0),c_fond) if len(n)>0 or i==1: draw_string("OR",150,150,(R,0,0),c_fond) draw_string("|PRESS [OK] OR [EXE] TO VALIDE|",5,170,(R,0,0),c_fond) else:fill_rect(0,150,320,50,c_fond) if keydown(KEY_ZERO) or keydown(KEY_ONE) or keydown(KEY_TWO) or keydown(KEY_THREE) or keydown(KEY_FOUR) or keydown(KEY_FIVE) or keydown(KEY_SIX) or keydown(KEY_SEVEN) or keydown(KEY_EIGHT) or keydown(KEY_NINE) or keydown(KEY_BACKSPACE): if keydown(KEY_ZERO) and len(n)>0:n.append("0") elif keydown(KEY_ONE):n.append("1") elif keydown(KEY_TWO):n.append("2") elif keydown(KEY_THREE):n.append("3") elif keydown(KEY_FOUR):n.append("4") elif keydown(KEY_FIVE):n.append("5") elif keydown(KEY_SIX):n.append("6") elif keydown(KEY_SEVEN):n.append("7") elif keydown(KEY_EIGHT):n.append("8") elif keydown(KEY_NINE):n.append("9") elif keydown(KEY_BACKSPACE) and len(n)>0:n.pop() while keydown(KEY_ZERO) or keydown(KEY_ONE) or keydown(KEY_TWO) or keydown(KEY_THREE) or keydown(KEY_FOUR) or keydown(KEY_FIVE) or keydown(KEY_SIX) or keydown(KEY_SEVEN) or keydown(KEY_EIGHT) or keydown(KEY_NINE) or keydown(KEY_BACKSPACE):1 fill_rect(230,y,120,17,c_fond) draw_string(str("".join(n))+"_",230,y,c_nombre,c_fond) fill_rect(230+len("".join(n))*10,15,10,1,c_fond) fill_rect(0,130,320,100,c_fond) Nombre_a_ecrire,y="Nombre 2 (facultatif):",y+15 while keydown(KEY_OK) or keydown(KEY_EXE):True if i==0:n1=int("".join(n)) elif i==1 and len(n)>0:n2=int("".join(n)) else:n2=0 return n1,n2 def premier(n,i=2): while i<n: if n%i==0:return False i+=1 return True def calculer_facteurs_premiers(n): ld,lf,i=[],[],2 while i<=n: if premier(i) and n%i==0: ld.append(n) lf.append(i) n//=i else:i+=1 if len(ld)==0:ld.append(1) if len(lf)==0:lf.append(1) return ld,lf def calculer_diviseurs(n): diviseurs=[] for i in range(n): if n%(i+1)==0:diviseurs.append(str(i+1)) return diviseurs def calculer_pgcd(liste1_p,liste2_p): pgcd,liste,liste_pgcd,liste1,liste2=1,[],[],[],[] for i in range(len(liste1_p)):liste1.append(liste1_p[i]) for i in range(len(liste2_p)):liste2.append(liste2_p[i]) if len(liste2)<len(liste1):liste1,liste2=liste2,liste1 while len(liste1)>0: puissance=1 if liste1[0] in liste2: while liste1[0] in liste2: if str(liste1[0]) in liste:puissance+=1 liste.append(str(liste1[0])) liste2.remove(liste1[0]) if puissance>1:liste_pgcd.append(str(liste1[0])+"^"+str(puissance)) else:liste_pgcd.append(str(liste1[0])) liste1.pop(0) for i in range(len(liste)):pgcd*=int(liste[i]) return pgcd,liste_pgcd def calculer_diviseurs_communs(d1,d2): dc=[] if len(d1)>len(d2):n,o=d1,d2 else:n,o=d2,d1 for i in range(len(n)): for j in range(len(o)): if str(n[i]) in str(o[j]):dc.append(str(i)) return dc def afficher_premier(n,p,x,y): draw_string(str(n),x,y,c_nombre,c_fond) if p:draw_string("EST PREMIER",x+len(str(n))*10+10,y,"green",c_fond) else:draw_string("N'EST PAS PREMIER",x+len(str(n))*10+10,y,"red",c_fond) def afficher_facteurs_premiers(ld,lf,x,y): draw_string(str(ld[0]),x-len(str(ld[0]))*10//2,y,c_nombre,c_fond) fill_rect(x-len(str(ld[0]))*10-10,y+19,len(str(ld[0]))*10+len(str(lf[-1]))*10+20,2,c_nombre) y+=21 for i in range(len(ld)): draw_string(str(ld[i]),x-(len(str(ld[i]))*10+10),y,c_nombre,c_fond) draw_string(str(lf[i]),x+10,y,c_nombre,c_fond) fill_rect(x-1,y,2,15,c_nombre) y+=15 def afficher_diviseurs(diviseurs,NB,x,y): draw_string("DIVISEURS "+NB+":",x,y,c_texte,c_fond) draw_string(",".join(diviseurs),x+110+len(NB)*10,y,c_nombre,c_fond) for i in range(len(diviseurs)//2): draw_string(str(diviseurs[i])+" "*(len(str(diviseurs[int(len(diviseurs)/2-0.5)]))-len(diviseurs[i]))+" x "+diviseurs[i-(1+2*i)],x,y+20,c_nombre,c_fond) y+=15 def afficher_pgcd(pgcd,liste_pgcd,x,y): if len(liste_pgcd)>0: draw_string("PGCD:",x,y,c_texte,c_fond) if len(liste_pgcd)==1 and not ("^" in str(liste_pgcd[0])):draw_string(str(pgcd),x+50,y,c_nombre,c_fond) else: draw_string("=",x+50+len("x".join(liste_pgcd))*10,y,c_texte,c_fond) draw_string(str("x".join(liste_pgcd)),x+50,y,c_nombre,c_fond) draw_string(str(pgcd),x+60+len("x".join(liste_pgcd))*10,y,c_nombre,c_fond) else:draw_string("PREMIERS ENTRE EUX",x,y,"green",c_fond) def afficher_divisible(n1,n2,x,y): if n2>n1:n1,n2=n2,n1 if n1%n2!=0:c,p="red","N'EST PAS DIVISIBLE PAR" else:c,p="green","EST DIVISIBLE PAR" draw_string(str(n1),x,y,c_nombre,c_fond) draw_string(str(n2),x+len(str(n1))*10+len(p)*10+20,y,c_nombre,c_fond) draw_string(p,x+10+len(str(n1))*10,y,c,c_fond) def afficher_diviseurs_communs(dc,x,y): if len(dc)>0: draw_string("DIVISEURS COMMUNS:",x,y,c_texte,c_fond) draw_string(",".join(dc),x+180,y,c_nombre,c_fond) else: draw_string("AUCUN DIVISEURS COMMUNS",x,y,c_texte,c_fond) n1,n2=recup_nombres() fill_rect(0,0,320,222,c_fond) fill_rect(30,150,260,15,c_texte) fill_rect(32,152,256,11,c_fond) draw_string("CALCUL EN COURS:",80,80,c_texte,c_fond) draw_string("Cela peut prendre du temps si",15,190,c_texte,c_fond) draw_string("les nombres sont trop grands",20,205,c_texte,c_fond) if premier(n1):p1=True else:p1=False if n2>0:fill_rect(34,154,36*1,7,c_texte) else:fill_rect(34,154,84*1,7,c_texte) d1=calculer_diviseurs(n1) if n2>0:fill_rect(34,154,36*2,7,c_texte) else:fill_rect(34,154,84*2,7,c_texte) ld1,lf1=calculer_facteurs_premiers(n1) if n2>0:fill_rect(34,154,36*3,7,c_texte) else:fill_rect(34,154,84*3,7,c_texte) x=140+len(",".join(d1))*10 y=70+len(d1)//2*15+len(lf1)*15 if n2>0: if premier(n2):p2=True else:p2=False fill_rect(34,154,36*4,7,c_texte) d2=calculer_diviseurs(n2) fill_rect(34,154,36*5,7,c_texte) ld2,lf2=calculer_facteurs_premiers(n2) fill_rect(34,154,36*6,7,c_texte) pgcd,liste_pgcd =calculer_pgcd(lf1,lf2) fill_rect(34,154,36*7,7,c_texte) dc=calculer_diviseurs_communs(d1,d2) if len(lf1)>len(lf2):l=len(lf1) else:l=len(lf2) y=195+(len(d1)+len(d2))//2*15 if len(lf1)>len(lf2):y+=len(lf1)*15 else:y+=len(lf2)*15 if 140+len(",".join(d2))*10>x:x=140+len(",".join(d2))*10 # elif 170+(",".join(dc)*10)>x:x=170+(",".join(dc)*10) X,Y,ptokh=0,0,True while keydown(KEY_EXE) or keydown(KEY_OK):1 while not (keydown(KEY_EXE) or keydown(KEY_OK)): if (keydown(KEY_UP) and Y<0) or (keydown(KEY_LEFT) and X<0) or (keydown(KEY_DOWN) and y>222-Y) or (keydown(KEY_RIGHT) and x>320-X) or keydown(KEY_ZERO) or ptokh: if ptokh:ptokh=False if keydown(KEY_UP) and Y<0:Y+=10 elif keydown(KEY_DOWN) and y>222-Y:Y-=10 elif keydown(KEY_LEFT) and X<0:X+=10 elif keydown(KEY_RIGHT) and x>320-X:X-=10 elif keydown(KEY_ZERO): X,Y=0,0 fill_rect(0,0,320,222,c_fond) if n2==0: afficher_premier(n1,p1,X,Y) afficher_diviseurs(d1,"NB1",X,Y+30) afficher_facteurs_premiers(ld1,lf1,X+150,Y+50+len(d1)//2*15) else: afficher_premier(n1,p1,X,Y) afficher_premier(n2,p2,X,Y+15) afficher_divisible(n1,n2,X,Y+35) afficher_pgcd(pgcd,liste_pgcd,X,Y+60) afficher_diviseurs(d1,"NB1",X,Y+90) afficher_diviseurs(d2,"NB2",X,Y+120+len(d1)//2*15) # afficher_diviseurs_communs(dc,X,Y+160) afficher_facteurs_premiers(ld1,lf1,X+75,Y+180+(len(d1)+len(d2))//2*15) afficher_facteurs_premiers(ld2,lf2,X+225,Y+180+(len(d1)+len(d2))//2*15)