Écrire un programme en c qui détermine si un nombre est parfait où pas
Écrire un programme en c qui détermine si un nombre est parfait où pas
C'est marrant Les 2 définitions font peur
Un nombre égal à la somme de ses diviseurs propres est parfait. Un diviseur propre est un diviseur autre que le nombre lui-même.L'exemple qui va bien :Lorsque la somme d’une suite de nombres doubles les uns des autres est un nombre premier, il suffit de multiplier ce nombre par le dernier terme de cette somme pour obtenir un nombre parfait.
- 1+2=3 qui est premier donc 2x3=6 est parfait.
- 1+2+4=7 qui est premier donc 4x7=28 est parfait.
- 1+2+4+8=15 n’est pas premier.
- 1+2+4+8+16=31 est premier donc 16x31=496 est parfait.
Ensuite le bon Euclide a donné une formule :
Cela sert la récursion, une suite mathématiques2^(p-1)*(2^p - 1) est parfait si p et (2^p - 1) sont premiers.
Et là tu tombes sur :
Donc cela se résume à 6 tests. C'est un programme de fouLes nombres parfaits sont rares, il n’en existe que trois inférieurs à 1000 qui sont 6, 28 et 496.
Ensuite vient 8128, puis 33 550 336,
8 589 869 056,
137 438 691 328,
2 305 843 008 139 952 128 (découvert par Leonhard Euler),
2 658 455 991 569 831 744 654 692 615 953 842 176, …
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if ((nb == 6) || (nb == 28) || (nb == 496) || (nb == 8128) || (nb == 33550336) || (nb == 8589869056)) { printf("this is a perfect number\n"); } else { printf("this is NOT a perfect number\n"); }
Source : Les nombres parfaits - sur le site "maths et tiques"
J'ai réussi à écrire l algorithme puis j'ai effectué la trace avec algobox ça fonctionne , le véritable problème c est lorsque je traduis en c ça donne pas le résultat attendu , je sais pas alors si j'ai mal initialiser ou pas où mal traduis
Si je souhaite que l'utilisateur entre un nombre
Avant de déterminer s'il est parfait où pas j'ai ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Int main() Int c , nb,i Printf(" entrez un nombre\n"); Scanf("%d",$nb); For(i==1; i<nb; i++) If(nb%i==0) C=c+1; If( c==nb) Printf(" il est parfait"); Else Printf ("il n'est pas parfait"); Return0;
Bonjour,
Vraiment ? Les formules de politesse, c'est bien quand on demande de l'aide : https://club.developpez.com/regles/#LIV-AÉcrire un programme en c qui détermine si un nombre est parfait où pas
Accessoirement, on n'est pas là pour faire votre travail : https://club.developpez.com/regles/#LIV-N
De plus, on n'est pas devin, sans code ni message d'erreur ni description du problème, on ne pourra pas vous aider : https://club.developpez.com/regles/#LIII-CJ'ai réussi à écrire l algorithme puis j'ai effectué la trace avec algobox ça fonctionne , le véritable problème c est lorsque je traduis en c ça donne pas le résultat attendu , je sais pas alors si j'ai mal initialiser ou pas où mal traduis
Ceci n'est pas du C...Int main()
Int c , nb,i
Printf(" entrez un nombre\n");
Scanf("%d",$nb);
For(i==1; i<nb; i++)
If(nb%i==0)
C=c+1;
If( c==nb)
Printf(" il est parfait");
Else
Printf ("il n'est pas parfait");
Return0;
Pensez également à ceci pour poster du code ça permet de le rendre plus lisible : https://club.developpez.com/regles/#LIII-E
On attend votre code avec les explications de ce qui ne va pas maintenant
Bonjour
Ton algorithme me semble un peu bizarre. Tu regardes si le nombre de diviseurs de "nb" vaut "nb" ce qui, mis à part pour "1" et "2", n'est pas possible (par exemple 48 n'a pas 48 diviseurs !!!) mais bon, ceci n'est pas une démonstration au sens mathématique du terme alors qui sait, peut-être qu'effectivement il existe un nombre "X" qui a "X" diviseurs
Et euh... accessoirement tester la division par 1 me semble un peu inutile (je crois qu'il existe une légende qui dit que tous les nombres sont divisibles par 1).
Sinon mes remarques en rouge dans ce canada-dry (ça ressemble à du C, son nom sonne comme un nom de prog C mais ce n'est pas du C).
Et maintenant un conseil: découpe les taches. D'un côté le main() qui se chargera de faire saisir le nombre et d'afficher s'il est ou n'est pas parfait ; et de l'autre une fonction qui détermine si le nombre est ou n'est pas parfait. Ainsi tu pourras tester le main tout seul, puis la fonction toute seule, et quand les deux seront ok, tu pourras alors intégrer la fonction dans le main.
Et aussi peut-être ouvrir un tutoriel de C parce que vu ton niveau...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Merci , j'arrivais pas à formater le code source raison pour laquelle je l'ai écrit dans les commentaires
Je tiens compte de toutes vos précisions
Bonjour,
C'est vrai que les lignes ressemblent à un mélange de langages. Il quand même reconnaître que c'est bien le C qui correspond le mieux à ces lignes. Ce qui nous a perturbé :
- les majuscules et les minuscules sont importantes, en particulier tous tes mots de début de lignes doivent commencer par une minuscule.
- les accolades servent à quelque chose. Elles ont toutes disparues dans ton code. Il manque au moins entre les lignes 1 et 2 et après la ligne 13.
- les point-virgules servent à quelque chose. Il manque ligne 2.
- pour prendre l'adresse d'une variable, il faut utiliser l'esperluette(&), pas le dollar($). Ligne 4.
- le = et le == sont différent. A un moment tu utilises == au lieu de =. Ligne 5.
- En C une variable doit être déclarée, et initialisée avant de pouvoir être utilisée. Ligne 7.
- les espaces sont parfois nécessaires. Il en manque un ligne 13.
Maintenant, pour revenir à l'algorithme lui-même, tu peux partir des commentaires de Sve@r.
Si @Cyrille motchiyo veut coder l'algo le plus complètement, et non feinter comme je l'ai fait avec mes 6 tests , alors c'est nettement plus difficile :
- il faut une fonction (fun_01, paramètre donnée : X) qui teste si un nombre X a comme multiple une puissance de 2 (A) (*) et retourne à la fois cette puissance N (A = 2^N) et B (B = (X / A))
- il faut une fonction (fun_02, paramètre donnée : X) qui teste si un nombre X est premier ou pas
- il faut une fonction (fun_03, paramètres donnée : X, N) qui teste si un nombre X est égal à la somme des N premières puissance de 2
- (*) éventuellement, il faut une fonction (fun_04, paramètres donnée : X) qui teste si un nombre X est une puissance de 2. Il faut utiliser un logarithme binaire (<- lien wiki français). Et log2(X) = (ln(X) / ln(2))
je ne donne pas les paramètres résultats des fonctions s'il y en a, ni les retours.
Parce que l'algo final est :
- Tu appelles fun_01. Tu as 2 nombres B et N en cas de succès. Sinon l'algo s'arrête : le nombre n'est pas parfait.
- Tu appelles fun_02 pour vérifier que B est premier. Si ce n'est pas le cas, l'algo s'arrête : le nombre n'est pas parfait.
- Tu appelles fun_03 pour vérifier que B est égal à la somme des N premières puissance de 2. Si c'est le cas, le nombre est parfait.
On peut simplifier fun_03 , parce que la somme des N premières puissance de 2 est égale à 2^(N + 1) - 1.
Cette simplification t'évite une boucle avec une borne maximale.
Édit 1 : les noms des fonctions sont mauvais, je ne me prends pas la tête sur cela ... par exemple fun_02 est is_a_prime_number
Édit 2 : (À confirmer ) pour tester si un nombre X est premier (fun_02), il faut faire une boucle de 2 à sqrt(X) (peut-être faire un +1/ ceil pour la perte de la partie flottante) et tester pour chacun s'il n'est pas multiple (le reste de la division différent de 0)
par exemple, 143 = 13 * 11 (sqrt(143) = 11.9582)
Édit 3 : (*), je vois 2 approches , mais à prouver mathématiques
- reprendre l'algo du test "nombre premier", mais avec les puissances de 2
- prendre la moitié du logarithme binaire du nombre (peut-être avec +1). Parce que la formule d'Euclide nous montre une multiplication entre 2^N et 2^(N + 1) (2 puissances successives). Par exemple, log2(6) = 2.58496 -> 6 = 2 x 3 = 2^(floor( log2(6) ) / 2) x 3, log2(496) = 8.9542 -> 496 = 16 x 31 = 2^(floor( log2(496) ) / 2) x 31. Et avec le logarithme binaire, tu peux détecter que le nombre est une puissance de 2, et donc il n'est pas parfait.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager