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

SL & STL C++ Discussion :

Résolution d'équation qui ne marche pas super.


Sujet :

SL & STL C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Par défaut Résolution d'équation qui ne marche pas super.
    Bonjour à tous !

    Je me suis lancé assez récemment dans les problèmes du projet Euler. Je suis entrain de tenter cet exercice : http://projecteuler.net/index.php?se...problems&id=66

    C'est plutôt chouette comme site.

    J'ai fait le code suivant, mais je ne vois pas où se trouve mon erreur. Le programme m'affiche 0 et se ferme tout juste après.

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <iostream>
    #include <cmath>
    #include <vector>
    #include <algorithm>
    using namespace std;
     
    inline bool isPerfectSquare(const unsigned long int& number);
     
    const unsigned long int MAX(10000);
     
    int main()
    {
        vector<unsigned long int> x, min;
     
        cout << "Investigate the Diophantine equation x^2 - Dy^2 = 1.\n";
     
        for(unsigned long int D(1); D <= 1000; ++D)
        {
     
            if(!isPerfectSquare(D))
            {
                for(unsigned long int y(1); y <= MAX; ++y)
                {
                    if(isPerfectSquare((1+(D*y*y))))
                    {
                        min.push_back(sqrt((1+(D*y*y))));
                    }
                }
                x.push_back(*min_element(min.begin(), min.end()));
                min.clear();
            }
        }
     
        cout << x.size() << endl;// ça devrait être égale à 1000
        cout << *max_element(x.begin(), x.end()) << endl;
        cout << "Solution : " << distance(x.begin(), max_element(x.begin(), x.end()))+1 << endl;
     
        return 0;
    }
     
    inline bool isPerfectSquare(const unsigned long int& number)
    {
        unsigned long int square(number), rootSquare(sqrt(number));
     
        if(square == rootSquare*rootSquare) return true;
        return false;
    }
    Merci beaucoup de votre aide !

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    je vois pas trop l'interet de ton vecteur....
    Tu devrais juste stocker un truc genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    unsigned long maxD = 0;
    unsigned long maxX = 0;
     
    ....
      if (x > maxX) {
          maxX = x;
          maxD = D;
      }
    ....
    non ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Par défaut
    Oui, excuse-moi de t'avoir dérangé mais je préfère garder les vector. C'est une source d'erreur en moins. J'obtiens le résultat avec ce 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include <iostream>
    #include <cmath>
    #include <vector>
    #include <algorithm>
    using namespace std;
     
    inline bool isPerfectSquare(const unsigned long int& number);
     
    const unsigned long int MAX(100);
     
    int main()
    {
        vector<unsigned long int> x, min;
     
        cout << "Investigate the Diophantine equation x^2 - Dy^2 = 1.\n";
     
        for(unsigned long int D(1); D <= 7; ++D)
        {
            if(!isPerfectSquare(D))
            {
                for(unsigned long int y(1); y <= MAX; ++y)
                {
                    if(isPerfectSquare((1+(D*y*y))))
                    {
                        min.push_back(sqrt((1+(D*y*y))));
                    }
                }
                x.push_back(*min_element(min.begin(), min.end()));
                min.clear();
            }
            else
            {
                x.push_back(0);
            }
        }
     
        cout << "Maximum value of D : " << x.size() << endl;
        cout << "Maximum value of x : " << *max_element(x.begin(), x.end()) << endl;
        cout << "Solution, D = " << distance(x.begin(), max_element(x.begin(), x.end()))+1 << endl;
     
        return 0;
    }
     
    inline bool isPerfectSquare(const unsigned long int& number)
    {
        unsigned long int square(number), rootSquare(sqrt(number));
     
        if(square == rootSquare*rootSquare) return true;
        return false;
    }
    Merci encore pour ton aide !

    Edit : en fait, ça ne marche pas. Si je fixe MAX a 10'000 ça marche, mais si je fixe MAX à 100'000, ça ne marche pas. Et c'est très bizarroïde, car ça devrait m'afficher les mêmes solutions. Je viens de découvrir une nouvelle méthode pour générer des nombres aléatoires en tout cas !

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Jie,
    Citation Envoyé par Xanto Voir le message
    Edit : en fait, ça ne marche pas. Si je fixe MAX a 10'000 ça marche, mais si je fixe MAX à 100'000, ça ne marche pas. Et c'est très bizarroïde, car ça devrait m'afficher les mêmes solutions. Je viens de découvrir une nouvelle méthode pour générer des nombres aléatoires en tout cas !
    Probablement un débordement de capacité.

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Essaye un coup de débuggeur ...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Par défaut
    Oui, c'est bien un débordement de capacité. Je ne pensais pas que ça allait le faire.

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Xanto Voir le message
    Oui, excuse-moi de t'avoir dérangé mais je préfère garder les vector. C'est une source d'erreur en moins. J'obtiens le résultat avec ce code.
    Oui d'accord, quand on a besoin de conserver tous les résultats précédants, mais ce n'est pas le cas, tu as juste besoin de connaitre le meilleur...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Par défaut
    Oui c'est clair ce que tu dis. C'est beaucoup plus rapide et beaucoup moins lourd d'utiliser ta méthode.

    Cependant, j'aime aussi regarder tout les doublets (x,y) de temps à autre pour savoir ce qu'il se passe. Et utiliser un vector ça a beaucoup d'avantages à ce niveau là.

Discussions similaires

  1. Programme super simple qui ne marche pas!
    Par _Michel dans le forum Visual C++
    Réponses: 2
    Dernier message: 07/01/2008, 18h50
  2. [SWING] KeyListener qui ne marche pas
    Par kindool dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 10/01/2005, 19h04
  3. Iptables configuration qui ne marche pas....
    Par The_Nail dans le forum Sécurité
    Réponses: 7
    Dernier message: 03/02/2004, 14h27
  4. Réponses: 3
    Dernier message: 08/09/2003, 15h06
  5. Réponses: 9
    Dernier message: 07/05/2003, 12h57

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