begin process at 2012 02 10 23:25:52
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

Nombres amis


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Membre Club
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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales