Accueil > Forum > > > > Nombres amis
Nombres amis
samedi 21 octobre 2006 à 10:10:54 |
Nombres amis

Darksnakes
|
Bonjour tout le monde,
Voila je débute en C, et pour un tp j'ai besoin de faire un programme qui m'affiche la liste des nombres amis inférieur ou égale à N telle que sommediviseur(a)=b et sommediviseur(b)=a. J'ai fais mon programme mais il ne m'affiche aucune résultats alors que je sais que 284 et 220 sont amis, voici mon programme, il est certainement très lourds, mais cela ne fais que deux semaines que j'ai débuter et que je ne fais que du C, donc je voudrais juste savoir ce qui cloche dans le programme merci :
#include <stdio.h>
int sommediviseur(int n) { int diviseur,sommed; sommed=0; for(diviseur=1;diviseur<=n/2;diviseur=diviseur+1) { if(n%diviseur==0) { sommed=sommed+1; } } return sommed; }
int main() { /* Affiche la liste des nombre amis 2 à 2 plus petit ou égale à A */ /*vérifiant (somme diviseur(nb1))= nb2 et vice -versa */ int nb1,nb2,A; printf("Donner un entier positif\n"); scanf("%d",&A); for(nb1=A;nb1>=2;nb1=nb1-1) { for(nb2=nb1-1;nb2>=1;nb2=nb2-1) { if((sommediviseur(nb1)==nb2) && (sommediviseur(nb2)==nb1)) { printf("les nombres %d et %d sont amis",nb1,nb2); } } } system("PAUSE"); }
Merci d'avance
Yann
|
|
samedi 21 octobre 2006 à 11:14:17 |
Re : Nombres amis

mad_love_disease
|
Réponse acceptée !
Ton programme est bon, seulement tu ne calcules pas la bonne chose.
284 et 220 sont amis car:
les diviseurs de 284 sont: 1, 2, 4, 71 et 142 (somme=220) les diviseurs de 220 sont 1, 2, 4,5, 10, 11, 20, 22, 44, 55, 110 (somme=284)
Regarde ce que te retourne ta fonction sommediviseur(in n) et tu comprendras pourquoi ca ne marche pas:
sommediviseur(284) va te renvoyer 5 au lieu de 220 sommediviseur(220) va te renvoyer 11 au de 284
Tu vois le truc??? ;)
Mad_Love_Disease
|
|
samedi 21 octobre 2006 à 11:19:07 |
Re : Nombres amis

Darksnakes
|
Ha oui, je vois mieux maintenant, je renvoyer le nombre de diviseur et non pas leur sommes, j'ai donc remplacé sommed=sommed+1 par sommed=sommed+diviseur, et ça marche de suite mieux.
Merci beaucoup pour la rapidité de la réponse, de totue façon je rsique de revenir pour d'autre problème un jour ou l'autre :-)
Encore merci
Yann
|
|
samedi 21 octobre 2006 à 11:25:26 |
Re : Nombres amis

Darksnakes
|
Encore une question : je vois clairement que ma recherche sera longue, n'y aurait t'il pas un moyen d'optimiser mon programme simplement, par exemple pour la recherche des diviseurs , ou tout simplement pour la recherche des nombres
merci
Yann
|
|
samedi 21 octobre 2006 à 14:06:48 |
Re : Nombres amis

Darksnakes
|
bon j'ai réécrit mon sous programme qui recherche les divisuer en allant jusqu'a la racine:
int sommediviseur(int n) { int diviseur,sommed; sommed=1; for(diviseur=2;diviseur<=sqrt(n);diviseur=diviseur+1) { if(n%diviseur==0) { sommed=sommed+diviseur+n/diviseur; } } return sommed; }
Est ce que cette partie du programme peut encore être améliorer mathématiquement??
|
|
samedi 21 octobre 2006 à 14:24:09 |
Re : Nombres amis

juki_webmaster
|
Réponse acceptée !
Salut,
for(diviseur=2;diviseur<=sqrt(n);diviseur=diviseur+1)
devient:
int s = sqrt(n);
or(diviseur=2;diviseur<=s;diviseur++)
sommed=sommed+diviseur+n/diviseur;
devient:
sommed+=diviseur+n/diviseur;
|
|
samedi 21 octobre 2006 à 14:27:43 |
Re : Nombres amis

Pole4
|
Réponse acceptée !
Il existe d'autres algorithmes de factorisation comme celui de rho
(inventé par Pollard) mais celui-là est suffisant pour les petits
nombres.
Pour le reste du programme, on peut aller bien plus vite en ne testant
que si sommediviseur(sommediviseur(a))==a, a et sommediviseur(a) seront
alors amis.
Pole.
|
|
samedi 21 octobre 2006 à 14:45:14 |
Re : Nombres amis

Darksnakes
|
Le problème Pole c'est que, ce que tu me dit me fait afficher deux fois les même pairs, mais il est vrai que c'est beaucoup plus rapide. Comment je peux faire pour que ça ne m'affiche pas les deux fois la même paire?
|
|
samedi 21 octobre 2006 à 15:20:07 |
Re : Nombres amis

Darksnakes
|
Bon ben pour le problème des deux pairs j'ai rajouté une condition, sinon grace a vous mon programme mets autant de temps pour afficher les nombres amis <= à 1000000 que l'ancien pour afficher les nombres amis <= à 10000. Le voici:
#include <stdio.h>
int sommediviseur(int n) { int diviseur,sommed,s; s=sqrt(n); sommed=1; for(diviseur=2;diviseur<=s;++diviseur) { if(n%diviseur==0) { sommed+=diviseur+n/diviseur; } } return sommed; }
int main() { /*Je fais le calcul pour tous les nombres compris entre 2 et A suivant le principe suivant */ /*2 nombres sont dis amis si sommediviseur(a)=b et si sommediviseur(b)=a*/ /*ce qui équivaut à sommediviseur(sommediviseur(a))=a alors */ /*sommediviseur(sommediviseur(a)) et a sont amis*/ int nb1,nb2,A; printf("Donner un entier positif\n"); scanf("%d",&A); for (nb1=A;nb1>=2;--nb1) { nb2=sommediviseur(nb1); if ((sommediviseur(nb2)==nb1) && (nb1<nb2)&& (nb1<=A) && (nb2<=A) )/*J'empeche de m'afficher deux foix la même paire*/ { /*ainsi que les valeurs >A et les nombres parfaits*/ printf("les nombres %d et %d sont amis\n",nb1,nb2); } } system("PAUSE"); }
si vous avez d'autres conseils, je suis prenneur
|
|
dimanche 22 octobre 2006 à 10:15:16 |
Re : Nombres amis

Pole4
|
Tu peux utiliser le crible d'Erathostène.
Dans un tableau de taille A, pour chaque nb < sqrt(A),tu parcours dans ton tableau par pas du nombre et tu ajoute ce nombre + l'index. A là fin, pour chaque nombre, tu as la somme des diviseurs.
int i,div1,div2;
for(i=0;i<=sqrt(A);i++){
div1=1,div2=i;
while(div2
|
|
Cette discussion est classée dans : int, amis, nb1, nb2, sommediviseur
Répondre à ce message
Sujets en rapport avec ce message
Erreur de définition de pointeurs [ par HellYodan ]
Bonjour,j'ai codé ce code mais à chaque fois que je compile il me met qu'il y a une erreur de définition de pointeurs. Mais je ne vois pas comment rég
VOID [ par langenoir7712 ]
AIDER MOI SVP JE VEUX LE MEME PROGRAMME MAIS MTN AVEC UN VOID POUR NE PAS AVOIR TOUT CE BLABLA REPONDEZ MOI SVPMERCI D'AVANCE#include #include #includ
aide pour calcul de formule [ par snakers07 ]
bonjour, j'ai crée un programme permettant de calculer une formule utilisant les opérateurs +,-,*,/ avec un controle sur les parenthése:par exemple :(
Je n'arrive pas a créer une variable aléatoire !!! [ par daikyo ]
Bonjour a tous, j'ai dévelopé un petit jeu ou l'on doit trouver un nombre entre 1 er 100 mais ce nombre (ici la variable Nb1) a trouver je souhaiterai
additio de deux grand nombre [ par sarlissa ]
bonjour[^^happy5] je voudrais que vous m'aidiez a développez un programme qui fait la somme de deux grand nombre que l'utilisateur les entre comme des
somme des diviseurs propres d'entier amis. [ par hazertyck ]
Bonjour, je suis etudiant en première année d'informatique à la fac. J'ai ici un exercice de tp en C dont l'énoncé est le suivant et où mon code est b
Comparer deux matrices [ par romain60112 ]
Bonsoir, Je rencontre un soucis, je n'arrive pas a comparer deux matrices. J'ai écrit un petit bout de code qui ne fonctionne pas le voici : int Mat
Hook + GetForegroundWindow + SendMessage [ par erodatam ]
Bonjour, Je souhaite faire un gestionnaire de presse papier en application win32. Grace à un hook, je suis capable d'intercepter les pressions sur le
Allocation dynamique tableau 2D : erreur de seg [ par noname001 ]
Bonjour à tous, [^^happy13] j'aimerais faire appel à vos lumières concernant deux codes. Ils ont tous les deux pour but de créer un tableau 2D dynami
Livres en rapport
|
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|