- Exercice création tableau de somme de diviseurs d'un nombre
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Comment faire un tableau - Guide
- Formule somme excel colonne - Guide
- Somme si couleur - Guide
5 réponses
Modifié le 3 févr. 2023 à 16:55
Bonjour Pierrot,
J'ai bien compris mais ça n'est pas conforme à la définition de nombre sublime, ou il est question de nombre parfait, pas de carré parfait. Par exemple 6 n'est pas un carré parfait, mais c'est un nombre parfait.
En arithmétique, un nombre parfait est un entier naturel égal à la moitié de la somme de ses diviseurs ou encore à la somme de ses diviseurs stricts. Plus formellement, un nombre parfait n est un entier tel que σ(n) = 2n où σ(n) est la somme des diviseurs positifs de n. Ainsi 6 est un nombre parfait car ses diviseurs entiers sont 1, 2, 3 et 6, et il vérifie bien 2 × 6 = 12 = 1 + 2 + 3 + 6, ou encore 6 = 1 + 2 + 3.
Du coup pour tester si un nombre est parfait, on peut écrire :
import math def diviseurs(n: int) -> iter: for i in range(1, n + 1): if n % i == 0: yield i def est_parfait(n: int, divs=None) -> bool: if divs is None: divs = diviseurs(n) return 2 * n == sum(divs) for n in range(1, 10000): divs = list(diviseurs(n)) if est_parfait(n, divs): print(n, divs)
Résultat :
6 [1, 2, 3, 6]
28 [1, 2, 4, 7, 14, 28]
496 [1, 2, 4, 8, 16, 31, 62, 124, 248, 496]
8128 [1, 2, 4, 8, 16, 32, 64, 127, 254, 508, 1016, 2032, 4064, 8128]
Bonne chance
Si tu as regardé dans Wikipedia, il n'y a que deux nombres sublimes: 12 et un nombre de 76 chiffres, Ça t'intéresse de le chercher?
(on se revoit dans un millénaire ...)
Je suis aveugle et je ne peux pas voir ton code. Si tu avais fait un copier-coller, je l'aurais "vu" avec ma synthèse.
... Tu n'avais pas posté ton code quand j'ai répondu.
Ta fonction sublime ne fonctionne évidemment pas.
Tu utilises trop les variables globales.
Tu pourrais passer les tableaux en paramètre ou les retourner.
À moins d'avoir de gros tableaux, numpy.array est inutile.
Tu pourrais utiliser append() sur tes listes et len() pour en connaître la longueur.
Voici mon code qui trouve bien 12:
# Un nombre égal à la somme de ses diviseurs propres est parfait. # Ça implique de soustraire le nombre lui-même à la somme de ses diviseurs. # Un nombre sublime est un entier naturel dont le nombre des diviseurs et la somme des diviseurs sont tous deux des nombres parfaits. def diviseurs(n): r = int(n ** 0.5) # Racine carrée. s = 0 # Somme c = 0 # Compte. for d in range(1, r + 1): if n % d == 0: # Si d divise n s += d + n // d c += 2 if r * r == n: # Si c'est un carré parfait (ex. 25) s -= r c -= 1 return c, s # Retourner le compte et la somme. for n in range(1, 100 + 1): cn, sn = diviseurs(n) cc, sc = diviseurs(cn) cs, ss = diviseurs(sn) if sc - cn == cn and ss - sn == sn: print(n)
3 févr. 2023 à 14:48
Bonjour Pierrot,
Attention, tu parles dans ton code de carrés parfaits (5 * 5 = 25) or la page wikipédia sur les nombres sublimes parle de nombres parfaits (e.g., 6).
Modifié le 3 févr. 2023 à 14:52
Bonjour,
Pour ton programme je te suggère de procéder dans l'ordre.
- Écris une fonction diviseurs(n) qui liste les diviseurs d'un entier positif. Une boucle for et l'opérateur % (modulo) te seront sûrement utiles.
- Écris une fonction est_parfait(n) qui teste si un entier positif n est parfait en t'appuyant sur la première fonction et la fonction sum, et qui retourne True si n est parfait, False sinon
- Écris une fonction est_sublime(n) qui teste si un entier positif n est sublime en t'appuyant sur les deux fonctions précédentes et la fonction sum, et qui retourne True si n est parfait, False sinon
Bonne chance
J'ai utilisé à tort le terme "carré parfait".
Je parle de nombres dont la racine carrée entkière est égale à la racine carrée non entière.
La racine carrée de 25 est 5.0 et la racine entière est 5.
La racine de 2 est 1.4142... et sa racine entière est 1.
La fonction sublime pourrait être mes 3 appels à diviseurs et retourner la condition du if qui suit.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question