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. #21
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Il me semble qu'avec ce programme ça fonctionne bien

    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
    #include<stdio.h>
     
    int main (int argc,char *argv[])
    {
    int n,k;
     
    	printf("Facteurs premiers\n");
    	printf("Introduire un nombre entier >1:  ");
    	scanf("%d",&n);
    	while(0==n%2)
    	{
     
    	printf("2 ");
    	n=n/2;
    	}
     
     
    	 k=3;
    	while(n!=2)
    	{
    		if(0!=n%k)
    		{
    			k=k+2;
    		}
    		else
    		{
    			printf("%d ",k);
    			n=n/k;
    		}
    	}
     
    			printf("\n");
     
     
    system("PAUSE");
    return 0;
    }

  2. #22
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    Nouvelle question sur un programme calculant la factorielle d'un nombre .
    Pourquoi j'obtiens une valeur négative avec 100 ?


    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
    #include<stdio.h>
     
    /* la fonction*/
     
    double fact(double x)
    {
    	return(x>1)?(x*fact(x-1)):1;
    }
     
    /*la fonction appelante*/
     
    int main()
    {
     
    	double x;
     
    	printf("Introduire x:");
    	scanf("%f",&x);
     
    	printf("la factorielle de %f est %f\n",x,fact(x));
    system("pause");
    return 0;
    }

  3. #23
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    ram-0000 :
    Un nombre quelconque n'a pas de facteurs premiers plus grands que sa racine
    ????
    6 = 2x3 et 3 > Racine(6)

  4. #24
    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 : 62
    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
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    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.
    Citation Envoyé par diogene Voir le message
    ram-0000 : ????
    6 = 2x3 et 3 > Racine(6)
    Heu oui, là, j'ai honte , c'est très mal dit.

    Extrait de wiki : Soit un entier composé à factoriser, les essais de divisions consistent à essayer de diviser ce nombre par chaque nombre premier inférieur ou égal à la racine de ce nombre.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    et en ce qui concerne le programme sur la factorielle ?

  6. #26
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    et en ce qui concerne le programme sur la factorielle ?
    C'est quoi fact(3.14) ?
    Ou en d'autres termes, pourquoi utiliser un double ?

    [edit] : autre question : %f c'est pourquoi déjà

    [edit 2] : tu n'as pas un debugger avec visual ? T'as essayé de voir quelle était la valeur prise par ta variable après la saisie ?

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    J'ai modifié mon 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
    #include<stdio.h>
     
    /* la fonction*/
    unsigned long fact(unsigned long x)
    {
    	return(x>1)?(x*fact(x-1)):1;
    }
     
    /*la fonction appelante*/
     
    int main()
    {
    unsigned long x;
     
    	printf("Introduire x:");
    	scanf("%lu",&x);
     
    	printf("la factorielle de %lu est %lu\n",x,fact(x));
    system("pause");
    return 0;
    }

    quand je veux connnaître la factorielle de 100 ça me donne 0
    Comment ça se fait ?

  8. #28
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le résultat de 100! ne tient pas, et de beaucoup s'en faut, dans un unsigned long

  9. #29
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Au delà, as-tu compris pourquoi ta première version ne fonctionnait pas (pour apprendre le langage, il faut aussi comprendre les erreurs, le codage n'est pas de la 'pensée magique')

  10. #30
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    J'ai changé le type de la fonction en double et là effectivement ça fonctionne

    Pour répondre à 3Darchi je crois que j'ai des soucis avec la ddésignation des types et ça doit être là mon problème principal

  11. #31
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Lors d'un scanf, il est IMPERATIF que le format corresponde à l'argument correspondant.
    Celui-ci n'est qu'une adresse et le format indique comment (et sur combien de bytes) scanf doit écrire le résultat. Il ne peut y avoir de conversion implicite d'un type à l'autre.

    Pour un double, la lettre de format est celle d'un float précédée de l (el) (comme signifiant long float) :
    Si on veut lire un double, le format est %lf, %f est utilisé pour un float.

  12. #32
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Si mes souvenirs mathématiques ne sont pas trop lointains, factoriel n'est défini que pour des entiers (positifs?) et pas pour autre chose. Donc ta fonction doit prendre en paramètre un entier et retourner un entier.
    Maintenant, quels sont les choix en C pour un entier (respectivement positif) :
    -> char ou unsigned char
    -> short ou unsigned short
    -> int ou unsigned int
    -> long ou unsigned long
    -> (non standard, je crois) : long long et unsigned long long

    float et double permettent de représenter des nombres 'réels'.
    Donc ta fonction ne peut pas prendre float ou double comme argument !

    Après comment choisir entre les autres. Ben, la seule chose que te garantie la norme est que chacun des types que j'ai mentionné ci-dessus représente au moins autant que celui qui le précède ( Au moins autant, ne veut pas forcément dire plus). Ensuite si tu veux calculer factoriel pour des nombres plus grand que puissent en contenir un unsigned long long (ou un unsigned long), alors il te faut construire toi même une représentation d'entiers plus grands (ou d'utiliser une bibliothèque qui le fait).
    Utiliser un double pour pouvoir accéder à de plus grandes représentations est une erreur de conception au regard des spécifications de factoriel.

    Après, pourquoi ton exemple précédent ne fonctionnait pas :
    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
     
    #include<stdio.h>
     
    /* la fonction*/
     
    double fact(double x)
    {
    	return(x>1)?(x*fact(x-1)):1;
    }
     
    /*la fonction appelante*/
     
    int main()
    {
     
    	double x;
     
    	printf("Introduire x:");
    	scanf("%f",&x);
     
    	printf("la factorielle de %f est %f\n",x,fact(x));
    system("pause");
    return 0;
    }
    x est double et tu fais scanf("%f",&x); Or %f c'est pour les float. Donc tu essais de mettre un float dans un double -> ça ne marche pas. Il faut que tu dises à scanf que tu veux un double et pas un float.

  13. #33
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    ok va falloir que je sois plus rigoureux dans la désignation de mes variables alors

    J'ai un autre soucis avec un nouvel exercice

    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
    #include<stdio.h>
    #include<conio.h>
     
     main ()
    {
    	double x,y,delta;
     
     
    	printf("Introduire x=");
    	scanf("%lf",&x);
     
     
    	y=(2*x*x+(2*(3/4)*x-2))/5-1;
     
     
    	printf("le resultat est %lf\n",y);
     
    	puts("pour continuer frapper une touche...");
    		getch();
     
    }



    Quand je veux vérifier ce programme manuellement:

    pour une valeur de x=4 je trouve manuellement 5.80 et avec le programme 4.60 ?
    Et il y a une différence avec toutes les valeurs que j'ai essayées.


    Je fais encore une erreur de désignation de variable ?

  14. #34
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut

    (par exemple, ici)

  15. #35
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    # Si au moins l'une des deux opérandes est de type flottant (float, double, long double) alors la division effectuée sera réelle, donnant un résultat décimal.
    # Le type du résultat de la division est celui de l'opérande réelle (si au moins l'une des deux l'est) possédant la plus grande capacité.
    eh bien ?

    Je ne comprends pas ?
    J'ai bien désigné mes variables comme étant des réels ? ça ne devrait pas poser de problème quant au résultat ?

  16. #36
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Essaies ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    y=(2*x*x+(2*(3/4)*x-2))/5-1;
    printf("2*x*x = %lf\n",2*x*x);
    printf("2*(3/4)*x-2 = %lf\n",2*(3/4)*x-2);
    printf("1+2 = %lf\n",(2*x*x+(2*(3/4)*x-2)));
    printf("/5 = %lf\n",(2*x*x+(2*(3/4)*x-2))/5);
    printf("-1 = %lf\n",(2*x*x+(2*(3/4)*x-2))/5-1);
     
    printf("le resultat est %lf\n",y);
    (Perso, je ne trouve ni 5.8 ni 4.6 avec x=4)

  17. #37
    Membre éclairé Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Par défaut
    printf("2*(3/4)*x-2 = %lf\n",2*(3/4)*x-2);
    c'est cette ligne là que je trouve erronée
    Pour x=1 ça me donne 2*3/4*1-2 ce qui fait 3/2-2 =>-1/2 ?

    alors que dans le programme ça me donne -2 comme résultat ?

    Je fais une erreur de calcul quelque part ?

  18. #38
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    2*(3/4) = 0
    2*(3./4.) = 1.5
    En fait, prend l'habitude de toujours préciser le type réel pour tes constantes sans rien présumer de ce que peut faire le compilateur de ton expression.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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