IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

problème exercice algorithmique


Sujet :

C

  1. #1
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut problème exercice algorithmique
    Bonjour

    ça fait quelque moments que je bute sur ce problème et je me décide à venir vous poser la question

    Je dois convertir un algorithme en programme C pour la décomposition d'un nombre entier en facteurs premiers
    J'ai l'algorithme mais je comprends pas bien

    ça me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    k<___3
    tant que n=1
    si (n modulo k = 0) alors k<-  -k+2
    sinon
    debut
       ecrire k
       n<___n/k
    avec n et k 2 entiers

    Je comprends pas la signification de ce passage ?

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    tu as sûr de ce que tu nous a donné parce que moi aussi, je sèche.
    J'ai l'impression que n est le nombre à décomposer mais j'ai l'impression que cet algorithme est incapable de décomposer 8 car le diviseur commence à 3

  3. #3
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Tu veux l'algo complet ?

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Tu veux l'algo complet ?
    ben oui, cela m'évitera de chercher ma boule de cristal, je l'ai oubliée au boulot

  5. #5
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    (tu pourras me la prêter ta boule de cristal stp ? )

    Code alogorithme : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    /*
    entier n
    entier k
     
    début
      écrire << Décomposition d'un nombre en facteurs premiers>>
      écrire<< Introduire un nombre>0>>
      lire n
      tant que n>0 faire
      début
              écrire<<Facteurs premiers>>
              tant n modulo 2=0 faire
              début
                     écrire <<2>>
                     n<---n/2
              fin
               k<___3
               tant que n=1 
               si(n modulo k =0) alors k<- -k+2
               sinon
               début
                     écrire k
                     n<___n/k
               fin    
               écrire<<Introduire un nombre>0>>
               lire n
       fin
    fin
    */

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    C'est plus facile quant on a tout

    La première partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
              tant n modulo 2=0 faire
              début
                     écrire <<2>>
                     n<---n/2
              fin
    gère les facteurs 2
    ensuite la partie suivante gère les facteurs impairs par contre, elle est bizarre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
               tant que n=1 
               si(n modulo k =0) alors k<- -k+2
               sinon
               début
                     écrire k
                     n<___n/k
               fin
    J'écrirai plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
               tant que n <> 1 
               si(n modulo k <> 0) alors k<- -k+2
               sinon
               début
                     écrire k
                     n<___n/k
               fin

  7. #7
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Tu pourrais me montrer le programme que tu pourrais faire avec cet algo ?

    Je te montre celui que j'ai voulu faire mais qui ne fonctionne pas avec visual

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include<stdio.h>
     
    int main (void)
    {
    long n,k;
     
    printf("Decomposition d'un nombre entier en facteurs premiers\n");
    printf("introduire un nombre>0:\n");
    scanf("%ld",&n);
     
    while(n>0)
    {
    	printf("Facteurs premiers");
    	while(0=n%2)
    	{
     
    	printf("ecrire 2\n");
    	n=n/2;
    	}
     
    	long k=3;
    	while(n=1)
    	{
    		if(0=n%k)
    			k=-k+2;
    		else
    		{
    			printf("ecrire k\n");
    			n=n/k;
    		}
    	}
    }

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    les tests en C, c'est avec ==
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while(n == 1)
    if(0 == n%k)

  9. #9
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    J'ai changé pour les tests et ça fonctionne bien merci

    par contre il me met un warning à la compilation sur le premier scanf et me met une erreur de syntaxe sur la ligne 21 en me disant "absence de ';' avant 'type' "

    Je comprends pas pourquoi à nouveau ?

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Le nouveau code s'il te plait et le message de warning complet

  11. #11
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    excuse moi encore pour mes imprécisions mais j'ai vraiment beaucoup de mal avec le langage et j'ai vraiment l'impression de patauger

    le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include<stdio.h>
     
    int main ()
    {
    long n=0,k;
     
    printf("Decomposition d'un nombre entier en facteurs premiers\n");
    printf("introduire un nombre>0:");
    scanf("%d",&n);
     
    while(n>0)
    {
    	printf("Facteurs premiers");
    	while(0==n%2)
    	{
     
    	printf("ecrire 2\n");
    	n=n/2;
    	}
     
    	long k=3;
    	while(n==1)
    	{
    		if(0==n%k)
    			k=-k+2;
    		else
    		{
    			printf("ecrire k\n");
    			n=n/k;
    		}
    	}
     
     
    }
    return 0;
    }
    les messages d'erreurs:

    Avertissement 1 warning C4996: 'scanf' a été déclaré désapprouvé c:\documents and settings\yannick\mes documents\visual studio 2005\projects\devoir1\devoir1\main.c 9


    Erreur 2 error C2143: erreur de syntaxe*: absence de ';' avant 'type' c:\documents and settings\yannick\mes documents\visual studio 2005\projects\devoir1\devoir1\main.c 21

  12. #12
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    En fait, tu as 2 choses,

    la 1ere, c'est un warning au sujet de scanf qui est désapprouvé. Probablement que Microsoft juge que la fonction n'est pas assez sûre. I; préférerait que tu utilises autre chose que scanf mais ce n'est qu'un warning, donc laisse tomber pour l'instant (il faudra y revenir quand même plus tard)

    Le 2eme est lié à la définition "long k=3;". Tu n'a pas le droit en C de définir une variable au milieu d'un bloc d'instructions. il faut remonter "long k;" avec les autres variables locales à ta fonction (en plus, je viens de voir que c'est déjà fait) et ensuite, tu peux faire "k = 3;"

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Bonjour,
    Pour compléter ce que dit ram-0000:
    • Tu devrais installer le SP1 de Visual, si c'est possible. Ça ne supprimera pas directement le Warning, mais ça le modifiera légèrement et surtout, ça modifie la commande nécessaire pour le désactiver. Les versions récentes de Visual utilisent la même commande que le SP1, la commande d'avant étant désormais obsolète.
      • La nouvelle commande consiste à définie _CRT_SECURE_NO_WARNINGS pour ta compilation, soit au début du fichier source (avec #define), soit dans les options du projet, section préprocesseur.
      • L'utilisation que tu fais de scanf() ne présente aucun problème de sécurité. Les avertissements de Microsoft concernent l'utilisation de scanf() pour la saisie de chaînes de caractères. Et surtout, l'alternative proposée est non-standard.
    • La déclaration une variable en milieu de bloc est interdite par les normes C89 et C90 du langage C, mais la nouvelle norme C99 l'autorise. Par contre, elle nécessite un compilateur qui supporte cette norme (à savoir: pas Visual Studio) et le choix de cette norme dans les options dudit compilo.

  14. #14
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Je le télécharge où le SP1 de Visual ?

    Par contre pour en revenir au programme j'ai effectué les modifications mais là le programme ne s'arrête plus et ne donne aucun résultat.En fait il tourne en boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include<stdio.h>
     
    int main ()
    {
    long n=0,k;
     
    printf("Decomposition d'un nombre entier en facteurs premiers\n");
    printf("introduire un nombre>0:");
    scanf("%d",&n);
     
    while(n>0)
    {
    	printf("Facteurs premiers");
    	while(0==n%2)
    	{
     
    	printf("ecrire 2\n");
    	n=n/2;
    	}
    }
     
    	 k=3;
    	while(n==1)
    	{
    		if(0==n%k)
    			k=-k+2;
    		else
    		{
    			printf("ecrire k\n");
    			n=n/k;
    		}
     
     
     
    }
    	system("PAUSE");
    return 0;
    }

  15. #15
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Je le télécharge où le SP1 de Visual ?

    ici http://msdn.microsoft.com/fr-fr/vstudio/bb265237.aspx
    ou
    ici http://www.microsoft.com/downloads/d...displaylang=fr
    suivant la version que tu as

  16. #16
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Merci je suis en train de le télécharger

    Et sinon pour le programme ?

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Le problème, c'est que je ne pige pas l'algo...

  18. #18
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    ben je crois que c'est mon problème aussi


    C'est une question sur un devoir sur le langage C pour educatel

    Je crois que je vais finir par demander des explications au prof

    Tu aurais une idée d'algo sinon pour la décomposition en facteurs premiers ?

  19. #19
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Si on reprend ton algo (et uniquement lui, j'ai pas regardé le code), cela prend un nombre, cela le divise par 2 tant qu'il est divisible par 2 et cela affiche les facteurs 2.

    Quand il n'est plus divisible par 2, cela tente de diviser par 3 puis par 5 puis par les autres nombres impair tant que le reste n'est pas 0.

    Ceci dit, ce n'est pas très optimisé puisque cela va tenter de diviser par 9 et par 15 (et d'autres nombres impais mais non premiers) alors que c'est inutile, les facteur 3 et 5 ont été déjà testés.

    Autre chose, il n'est pas utile de tester plus loins que la racine carée du nombre. Un nombre quelconque n'a pas de facteurs premiers plus grands que sa racine.

  20. #20
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    ok

    Mais tu peux m'expliquer sinon purquoi mon programme ne fonctionne pas ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème dans un exercice algorithmique
    Par abdou005 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 13/11/2011, 16h03
  2. Exercice algorithmique
    Par le marocain dans le forum Langage
    Réponses: 2
    Dernier message: 21/10/2007, 02h34
  3. Problème exercice facile
    Par arnaud405 dans le forum Caml
    Réponses: 17
    Dernier message: 04/10/2007, 22h30
  4. Problème en Algorithmique
    Par psychoman dans le forum Mathématiques
    Réponses: 30
    Dernier message: 17/09/2007, 11h37
  5. Problème Exercice Débutant
    Par nanoute dans le forum C
    Réponses: 34
    Dernier message: 19/05/2007, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo