Exercice création tableau de somme de diviseurs d'un nombre

Fermé
Mimou - Modifié le 3 févr. 2023 à 14:42
 PierrotLeFou - 3 févr. 2023 à 18:05

Bonjour/Bonsoir,

Je suis à la recherche d'une personne qui peut me dire quels sont les fautes que j'ai commises dans mon programme et comment les réparer.

Activité :

Soit T un tableau de n entiers strictement positifs (0 < n ≤ 10).

On désire former un autre tableau TS qui contiendra tous les nombres sublimes se trouvant dans le tableau T puis afficher le résultat.

Mon travail :

#declaratoion des cts
m0="entrer le nombre d'elements"


#importation des modules
from numpy import array
t= array([]*10,dtype=int)
ts= array([]*10,dtype=int)


#declaration des modules
def sublime (k):
    s = 0
    for i in range(1, k+1):
        if k%i == 0:
            s += i
            
def saisie (ch):
    global n
    n=int(input(ch))
    
    
def affiche (a,k):
    print("le nombre sublime sont:",k)
    for i in range (k):
        print(a[i],end= " ")
    print() #retour a la ligne apres l'affichage
  
def remptab (k):
    global t
    for i in range (k):
        t[i]=int(input("entrer l'element t[ "+str(i)+"] "))
    
def trait (a,k):
    global ts,s
    s=-1
    for i in range (k):
        if sublime(a[i]) == True :
            s=s+1
            ts[s] = a[i]

 #cors de programme principal 
n=saisie(m0)

remptab (n)


trait (t,n)


affiche (ts,s)
A voir également:

5 réponses

mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 7 801
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

1

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)
0
mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 7 801
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).

0
mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 7 801
Modifié le 3 févr. 2023 à 14:52

Bonjour,

Pour ton programme je te suggère de procéder dans l'ordre.

  1. É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.
  2. É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
  3. É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

0

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.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question

Ce n'est pas du tout llà où je voulais en venir:
Quels sont les diviseurs de 12:
[1, 2, 3, 4, 6, 12]
Quels sont les diviseurs de 25:
[1, 5, 5, 25] ou ]1, 5, 25]
int(sqrt(12)) != sqrt(12) mais int(sqrt(25)) == sqrt(25)
Un diviseur ne doit pas apparaître deux fois.
D'où mon test:
   if r*r == n:

0