Aller au menu - Aller au contenu
Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !

Projet Euler

C++

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1 
Hors ligne 008 # Posté le 23/02/2009 à 03:41:02

Ville : Gatineau
Pays : Canada

Bonjour,
Je suis en train de faire le deuxième problème, mais pour une raison que je ne comprends pas, il me donne la mauvaise réponse.
Voici mes fichiers :
Veuillez notez, j'utilise Qt
Code : C++
 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "FenPrincipal.h"

FenPrincipal::FenPrincipal() : QWidget()
{
   // Cela est juste la préparation di widget
 bouton = new QPushButton(this);
    layout = new QHBoxLayout(this);
    layout->addWidget(bouton);
    setLayout(layout);

    // exemple pour m'aider1 - 2 - 3 - 5 - 8 - 13 - 21 - 34 - 55
    total = 0;
    resultat = 0;

    int numeroUn = 1;
    int numeroDeux = 2;
    continuer = true;
    lesReponse.push_back(2); // j'ai déjà 2
    int tmp;
    while ( continuer == true)
    {
        resultat = numeroUn + numeroDeux;
        int tmpPaire = resultat % 2;
        if ( tmpPaire == 0) // si le nombre est un nombre pair
        {
            if ( totalDesNumeros() ) // vérification si ce n'est pas supérieur a 4000000
            {

                lesReponse.push_back(resultat); // si non on le rajoute
            }
        }

        tmp = numeroDeux; // tmp est égal à 2
        numeroDeux = resultat; // NumeroDeux est égal à 3
        numeroUn = tmp; // NumeroUn est égal à 2

    }
    total = 0;
    for ( int i = 0 ; i < lesReponse.size() ; i++)
    {
        total  += lesReponse[i];
    }
    QString string;
    string.setNum(total);
    bouton->setText(string);
}
bool FenPrincipal::totalDesNumeros()
{
total = 0;
int resultatTmp;

resultatTmp = resultat;
    for ( int i = 0 ; i < lesReponse.size() ; i++)
    {
        total  += lesReponse[i];
    }
    total += resultatTmp;
    if ( total >= 4000000)
    {
        continuer = false;
        return false;

    }
    else
    {
        return true;
    }
}

Édité le 23/02/2009 à 03:45:39 par 008

J'espère avoir été clair :p si besoin plus d'information dites-moi le :p
:D Merci d'avance :D

La doc a toujours raison
Merci Pour vos futur réponse
 
Publicité # Posté le 23/02/2009 à 03:41:02

Hors ligne Ice_Keese # Posté le 23/02/2009 à 03:47:31
Life is weird (and awesome)
Avatar

Études : UdS

Pourquoi utiliser Qt? Un simple programme console ferait l'affaire, non?

Là, tu augmentes la complexité du problème inutilement.

Image utilisateur
 
Hors ligne xxitheworld # Posté le 23/02/2009 à 04:00:22
Avatar

Je vais dire comme Ice, Qt est franchement inutile pour résoudre un problème de Project Euler, car tout ce que l'on veut c'est la réponse.

Ton code n'est pas commenté, et en plus il utilise Qt, donc je ne comprend pas exactement ce qu'il fait mais tu semble calculer la suite au complet de la manière ''classique''. Si tu continue sur project Euler, tu remarquera que la manière 'papier et crayon' (dans ce cas si calculer chaque nouveau nombre en fonction des deux précédents), ne fonctionnera pas, ou sera très lente.

Je te suggère d'utiliser à la place la formule Image utilisateur

Page Wikipedia pour les précisions

(Un peu de recherche aide toujours :D)

avec cette formule, mon programme fait une quinzaine de lignes

int i = 0;
main() { printf("%d ",i); i++; main(); }
 
Hors ligne 008 # Posté le 23/02/2009 à 04:16:22

Ville : Gatineau
Pays : Canada

Citation : Ice_Keese
Pourquoi utiliser Qt? Un simple programme console ferait l'affaire, non?

Là, tu augmentes la complexité du problème inutilement.


Je sais que je ne suis pas obligé de l'utiliser, mais cela ne me dérange pas.

Pour la complexité je ne comprends pas. Utilisé Qt rajoute seulement ça.

Code : C++
1
2
3
4
5
// Cela est juste la préparation di widget
 bouton = new QPushButton(this);
    layout = new QHBoxLayout(this);
    layout->addWidget(bouton);
    setLayout(layout);

Citation : xxitheworld
Je vais dire comme Ice, Qt est franchement inutile pour résoudre un problème de Project Euler, car tout ce que l'on veut c'est la réponse.

Ton code n'est pas commenté, et en plus il utilise Qt, donc je ne comprend pas exactement ce qu'il fait mais tu semble calculer la suite au complet de la manière ''classique''. Si tu continue sur project Euler, tu remarquera que la manière 'papier et crayon' (dans ce cas si calculer chaque nouveau nombre en fonction des deux précédents), ne fonctionnera pas, ou sera très lente.

Je te suggère d'utiliser à la place la formule Image utilisateur

Page Wikipedia pour les précisions

(Un peu de recherche aide toujours :D)

avec cette formule, mon programme fait une quinzaine de lignes

Je vais regarder cela.

J'espère avoir été clair :p si besoin plus d'information dites-moi le :p
:D Merci d'avance :D

La doc a toujours raison
Merci Pour vos futur réponse
 
Hors ligne Goten_ # Posté le 23/02/2009 à 11:36:32

Utilise std::accumulate() pour faire la somme plutôt que ta boucle
Hors ligne Nanoc # Posté le 23/02/2009 à 11:36:52
Aimez-vous le C++ ?
Avatar
Validateurs

Ville : Durham
Pays : Royaume-Uni
Études : EPFL

Le problème de cette formule c'est qu'elle n'est pas correcte pour les premiers termes.

Calculer les termes explicitement est beaucoup mieux.
 
Hors ligne 008 # Posté le 24/02/2009 à 03:17:40

Ville : Gatineau
Pays : Canada

Voici les modifications que j'ai faites sur mon fichier en considérant la fonction Code : C++
1
std::accumulate()

et en considérant la suite comme telle :
0 - 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21

Voici le résultat:
Code : C++
 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
51
52
53
54
55
56
57
58
59
60
61
62
#include "FenPrincipal.h"
#include <numeric>
FenPrincipal::FenPrincipal() : QWidget()
{
    bouton = new QPushButton(this);
    layout = new QHBoxLayout(this);
    layout->addWidget(bouton);
    setLayout(layout);

    // 1 - 2 - 3 - 5 - 8 - 13 - 21 - 34 - 55
    total = 0;
    resultat = 0;

    int numeroUn = 1;
    int numeroDeux = 2;
    continuer = true;
    lesReponse.push_back(2);
    int tmp;


    while ( continuer == true)
    {
        resultat = numeroUn + numeroDeux;
        int tmpPaire = resultat % 2;
        if ( tmpPaire == 0)
        {
            if ( totalDesNumeros() )
            {

                lesReponse.push_back(resultat);
            }
        }

        tmp = numeroDeux; // TMP = 2
        numeroDeux = resultat; // NUMÉROdEUX = 3
        numeroUn = tmp; // NUMEROUN = 2

    }

total = std::accumulate(lesReponse.begin(), lesReponse.end(), 0);
QString string;
    string.setNum(total);
    bouton->setText(string);
}
bool FenPrincipal::totalDesNumeros()
{

int resultatTmp;

resultatTmp = resultat;
    total = std::accumulate(lesReponse.begin(), lesReponse.end(), 0);
    total += resultatTmp;
    if ( total >= 4000000)
    {
        continuer = false;
        return false;
    }
    else
    {
        return true;
    }
}

Mais ce n'est pas la bonne réponse.
Édité le 24/02/2009 à 03:29:33 par 008

J'espère avoir été clair :p si besoin plus d'information dites-moi le :p
:D Merci d'avance :D

La doc a toujours raison
Merci Pour vos futur réponse
 
Hors ligne El roux # Posté le 24/02/2009 à 20:02:54
sizeof(void)
Avatar

Études : EPM

Petite question pour ceux qui le savent, je commence project euler moi aussi :
On veut la somme de tous les termes qui n,exède pas 4 millions où le terme le plus proche de 4 millions?

La vie est comme une fonction qui retourne un pointeur sur void...
 
Hors ligne Nanoc # Posté le 24/02/2009 à 20:08:51
Aimez-vous le C++ ?
Avatar
Validateurs

Ville : Durham
Pays : Royaume-Uni
Études : EPFL

Hors ligne El roux # Posté le 24/02/2009 à 22:15:41
sizeof(void)
Avatar

Études : EPM

Des termes pairs o_O ??
even-valued terms veux dire pairs?
Est-ce que c'est la somme qui ne doit pas excèder 4 millions?

La vie est comme une fonction qui retourne un pointeur sur void...
 
Hors ligne cerium50 # Posté le 24/02/2009 à 22:47:31
1 23 / 4 5 * 6 - 78 9 - * *
Avatar

Études : Polytech'Nice-Sophia Antipolis

La somme de tout les termes pairs qui sont contenus dans la suite sur l'intervalle [1, 4000000], donc la somme de tout les termes pairs de la suite entre 1 et 4000000.

Python3.
Image utilisateur
 
Hors ligne El roux # Posté le 24/02/2009 à 23:18:08
sizeof(void)
Avatar

Études : EPM

ok merci :)
Haa tiens la réponse c'est 4 :-° ...!
Édité le 24/02/2009 à 23:18:38 par El roux

La vie est comme une fonction qui retourne un pointeur sur void...
 
Hors ligne Goten_ # Posté le 24/02/2009 à 23:18:35

Citation : El roux
Des termes pairs o_O ??
even-valued terms veux dire pairs?
Est-ce que c'est la somme qui ne doit pas excèder 4 millions?


even = pair. Et non c'est les termes inférieur à 4 millions.
Hors ligne candide # Posté le 24/02/2009 à 23:27:26
"In C ode we trust"
Avatar

Citation : 008

Je suis en train de faire le deuxième problème,


cf. Projet Euler, exo 2, forum C


Citation : 008

Veuillez notez, j'utilise Qt

:o :o :o :o :o

  • Make it work, Make it well, Make it fast, Make it short, Make it fun
  • Comment insérer les balises de code dans un message ? : Screencast ou Texte
  • Le rasoir d'Occam : Entities should not be multiplied beyond necessity.
  • KISS !
  • Le gâteau sous la cerise.
  • (Lien vers fichier pdf) La norme du langage C 99
  • scanf et printf : les colifichets de la programmation bling bling

 
Hors ligne 008 # Posté le 25/02/2009 à 02:57:30

Ville : Gatineau
Pays : Canada

Je viens de comprendre mon erreur.
Erreur très bête en passant.
Code : C++
1
2
3
4
5
resultatTmp = resultat;
    total = std::accumulate(lesReponse.begin(), lesReponse.end(), 0);
    total += resultatTmp;
    if ( total >= 4000000)
    {

Ici je calcule si le total n'excède pas 4 000 000 alors que je dois vérifier si le résultat n'excède pas 4 000 000.


J'espère avoir été clair :p si besoin plus d'information dites-moi le :p
:D Merci d'avance :D

La doc a toujours raison
Merci Pour vos futur réponse
 
Hors ligne Mikechaos # Posté le 25/02/2009 à 03:25:15
Zah
Avatar

Études : Cégep Lionel-Groulx

J'ai rien dit.
Édité le 25/02/2009 à 03:27:01 par Mikechaos

Citation : Einstein
Il y a deux choses d'infinies.
-L'univers
-La bêtise humaine
Bien que pour l'univers, rien n'est encore sûr.

Citation : Socrate
Le premier pas vers la connaissance,
c'est d'admettre qu'on ne sait rien
 

Retour au forum "Langage C++" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx