Aller au menu - Aller au contenu

Projet Euler, exercice 2

Inspiré du forum C++

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1  2  3  4  Suivante
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1  2  3  4  Suivante
Hors ligne candide # Posté le 24/02/2009 à 15:41:11
"In C ode we trust"
Avatar

Bonjour

Sur le forum C++, quelqu'un demande de résoudre l'exercice 2 du projet Euler.


En deux mots, on considère la suite de Fibonacci dont les deux premiers termes sont 1 et 2 et dont les autres termes s'obtiennent en ajoutant les deux termes qui précèdent, ce qui donne :

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, etc.


(Pourquoi 144 ? parce que c'est la somme de deux termes précédents 55 et 89)

L'exercice demande de calculer la somme de tous les termes de cette suite qui sont pairs et inférieurs à 4 millions. Pour bien comprendre, si on avait demandé la somme de tous les termes de la suite qui sont pairs et ne dépassant pas 100, la réponse aurait été

2 + 8 + 34 = 44.



Les débutants (et non débutants s'ils le veulent) peuvent proposer leur solution (en C) dans ce fil.




 
Hors ligne Jaloyan1 # Posté le 24/02/2009 à 16:15:55
Sms = portable,forum = clavier
Avatar

Ma petite solution('avant l'implémentation) en secret.

Secret (cliquez pour afficher)
Voici une partie de cette suite.

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584.

J'ai remarqué que les nombre pairs de cette suite apparaissaient tout les 3 nombres(à partir de 2)

Pourquoi?

Car On à un nombre pair(à partir de 2,on exclus 1), un nombre impair et un nombre impair.

La somme des 2 nombres impairs est paire.
Donc on a :
pair, impair, impair, pair.
ensuite, on additionne impair et pair, cela donne un nombre impair.
Cela se refait une autre fois.

donc cela fait :
pair, impair, impair, pair, impair, impair,
et ensuite encore le même raisonnement à l'infini.

Donc cela revient à faire un programme qui ajoute à un nombre x(valant 2) tous les nombres ayant pour position dans cette suite(sachant que 1 a pour indice 1) suite[3i + 2)
Évidemment, cela est la technique si on possède déjà la liste, mais on peut s'en tirer avec une boucle qui génère des nombres de cette suite dans l'ordre et à chaque 3 tours de boucles, on l'ajoute à un nombre x.


Je me lance dans l'implémentation dès maintenant. Elle sera disponible bientôt.

Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir.
:D int x = 0; x >?= (a < b)?((a < c)?((a < d)?a:d):((c < d)?c:d)):((b < c)?((b < d)?b:d):((c < d)?c:d));
Quelqu'un a compris ce que ce code fait? :-°
 
Hors ligne candide # Posté le 24/02/2009 à 16:31:24
"In C ode we trust"
Avatar

Citation : Jaloyan1

Donc cela revient à faire un programme qui ajoute à un nombre x(valant 2) tous les nombres ayant pour position dans cette suite(sachant que 1 a pour indice 1) suite[3i + 2)
Évidemment, cela est la technique si on possède déjà la liste, mais on peut s'en tirer avec une boucle qui génère des nombres de cette suite dans l'ordre et à chaque 3 tours de boucles, on l'ajoute à un nombre x.


Tout ceci me parait bien compliqué. Souvent en algorithmique, on commence par chercher midi à 12 heures et si on ne l'y trouve pas, on va le chercher ailleurs.


 
Hors ligne Catsoulet # Posté le 24/02/2009 à 16:43:56
Ils sont par minous
Avatar

Ville : Fontenay le comte
Pays : France métropolitaine

J'ai ma petite idée, malheuresement j'ai pas le temps là... j'esserais de coder la fonction plus tard, je pense pas que cela soit très compliqué ;) Mais parcontre, est-il préférable de stocker tous les nombres dans un tableau ? (niveau place mémoire c'est pas gênant ?) ou sinon faire le calcul avec les nombres sans les stocker ?
Je sais que c'est un choix perso mais bon...
Hors ligne Nyblas # Posté le 24/02/2009 à 16:48:29
Avatar

Voila voila ... Fait vite fait, mais qui semble donner le bon résultat.

Secret (cliquez pour afficher)
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>

#define MAX 4000000

int     main(void)
{
    unsigned int    nb1 = 1, nb2 = 2, nb3 = 0, result = 2;

    while (nb3 <= MAX)
    {
        nb3 = nb1 + nb2;
        if (nb3 % 2 == 0 && nb3 <= MAX)
            result += nb3;
        nb1 = nb2;
        nb2 = nb3;
    }
    printf("%d\n", result);
    return EXIT_SUCCESS;
}


EDIT : edité selon la remarque de Jaloyan (un && et un define rajouté)
Édité le 24/02/2009 à 17:12:22 par Nyblas
Connecté GurneyH # Posté le 24/02/2009 à 16:53:12
Avatar

Salut,

Voici la solution que j'ai donné à ce problème.
Secret (cliquez pour afficher)
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
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    size_t index;
    int suite[100];
    int somme;

    suite[0] = 0;
    suite[1] = 1;

    for (index = 2, somme = 0; (suite[index - 1] + suite[index - 2]) <= 4000000 ; index += 1)
    {
        suite[index] = (suite[index - 1] + suite[index - 2]);
        if (suite[index] % 2 == 0)
        {
            somme += suite[index];
        }
    }
    printf("%d", somme);
    return 0;
}

Ce doit être l'algo le plus naïf... Sur le forum du projet Euler, pour chaque problème, il y a des solutions présentées qui sont vraiment impressionnantes...

Edit : problème de copier-coller.
Édité le 24/02/2009 à 16:56:34 par GurneyH
 
Hors ligne Jaloyan1 # Posté le 24/02/2009 à 16:59:04
Sms = portable,forum = clavier
Avatar

@nyblas, ton code ne fonctionne pas. Essaie avec la limite de 100.


j'ai fait un algo un peu compliqué, mais cette histoire de modulo m'a complètement échappé.
Je vais utiliser la fonction modulo.

J'ai réussi à trouver une utilisation très appropriée de goto dans mon code.

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
#include <stdio.h>
#include <stdlib.h>

#define LIMIT 4000000

int main(void)
{
	size_t a = 1, b = 2;
	size_t i = 1, j = 0, x = 2;

	do
	{
	    if(i == 1)
	    {
	        a += b;

	    }
	    else if(i == 2)
        {
            b+= a;
        }

        if(a > LIMIT || b > LIMIT) goto point;
        i++;
        j++;
        if(j == 3)
        {
            if(i == 2)
            {
                x += a;
            }
            else if(i == 3)
            {
                x += b;
            }
            j = 0;
        }
        if(i == 3)
        {
            i = 1;
        }
    }while(1);
    point:
    printf("%d\n",x);
    return 0;
}


Voilà code vite fait.



EDIT : Voici la nouvelle version de mon code.


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
#include <stdio.h>
#include <stdlib.h>

#define LIMIT 4000000

int main(void)
{
    size_t a = 1, b = 2;
    size_t i = 1, x = 2;

    do
    {
        if(i == 1)
        {
            a += b;
            if(a > LIMIT || b > LIMIT) goto point;
            if((a % 2) == 0) x += a;
        }
        else if(i == 2)
        {
            b+= a;
            if(a > LIMIT || b > LIMIT) goto point;
            if((b % 2) == 0) x += b;
        }
        i++;
        if(i == 3)
        {
            i = 1;
        }
    }while(1);
    point:
    printf("%d\n",x);
    return 0;
}




On se rends compte que dans ce cas là goto est très pratique(je ne connais pas d'autres moyen pour arrêter la boucle à temps)


EDIT : indentation du code
Édité le 24/02/2009 à 17:07:52 par Jaloyan1

Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir.
:D int x = 0; x >?= (a < b)?((a < c)?((a < d)?a:d):((c < d)?c:d)):((b < c)?((b < d)?b:d):((c < d)?c:d));
Quelqu'un a compris ce que ce code fait? :-°
 
Hors ligne Nyblas # Posté le 24/02/2009 à 17:10:42
Avatar

Citation : Jaloyan1
@nyblas, ton code ne fonctionne pas. Essaie avec la limite de 100.


C'est bon j'ai modifié ça (juste à rajouter un && :) (et puis un define pour faire joli).
Hors ligne pknzeta # Posté le 24/02/2009 à 17:19:11
Every one love the hypnotoad
Avatar

Citation : Jaloyan1
On se rends compte que dans ce cas là goto est très pratique(je ne connais pas d'autres moyen pour arrêter la boucle à temps)

etbreak; non?
Secret (cliquez pour afficher)
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
#include <stdio.h>
#include <stdlib.h>

#define LIMIT 4000000

int main(void)
{
    size_t a = 1, b = 2;
    size_t i = 1, x = 2;

    do
    {
        if(i == 1)
        {
            a += b;
            if(a > LIMIT || b > LIMIT) break;
            if((a % 2) == 0) x += a;
        }
        else if(i == 2)
        {
            b+= a;
            if(a > LIMIT || b > LIMIT) break;
            if((b % 2) == 0) x += b;
        }
        i++;
        if(i == 3)
        {
            i = 1;
        }
    } while(1);
    printf("%lu\n",x);
    return 0;
}


Hors ligne Gambit2099 # Posté le 24/02/2009 à 17:23:23
Crow never dies...
Avatar

études : IIM

avec limite à 100:
Code : Console
44


avec limite à 4 000 000:
Code : Console
4613732


code (j'ai été droit au but et n'oublions pas que j'aime la simplicité..):
Secret (cliquez pour afficher)
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

int main(void)
{
    int x = 0, y = 1, z = 0, total = 0;

    do
    {
        z = x + y;

        if(!(y % 2))
        total += y;

        x = y;
        y = z;
    } while (z < 4000000);

    printf("%d", total);

    return 0;
}
Édité le 24/02/2009 à 17:34:24 par Gambit2099

Mon Blog-Art (dessins, recherches, croquis)
Mon compte Dailymotion (animations, montage vidéo)
A quoi je ressemble: Clique!
Stop à la pop-programmation !

 
Hors ligne IATGOF # Posté le 24/02/2009 à 17:28:28
Inspecteur Sablo-Vaginos
Avatar

Ville : Talence
Pays : France métropolitaine
études : EPITECH Bordeaux

Voici mon implémentation avec méthode commentée.
Secret (cliquez pour afficher)
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
#include <stdio.h>
#include <stdlib.h>

#define MAX 4000000

int main(void)
{
    double somme = 2;
    int precedant = 1;
    int nombre = 2;
    int nouveau = 0;

    do
    {
        nouveau = 3*nombre + 2*precedant;
        /**
        En étudiant les parités (impair+impair = pair, pair+pair = pair et impair+pair = impair)
        on remarque q'un membre pair est suivi de deux nombres impairs avant de redevenir pair.
        Pour calculer un membre, il nous faut les deux précédants.
        Posons a,b,c,d,e membres de la suite avec b pair. a,c,d sont donc impairs et e est pair.
        Comme on ne calcule que les nombre pairs, il ne nous faut trouver que e.
        on a e = d + c = (c + b) + (a + b) = ((a + b) + b) + (a + b) = 3b + 2a
        */

        if(nouveau < MAX) /** on teste la valeur maximale avant d'incrémenter la somme */
        {
            somme+=nouveau;
            precedant+= (2*nombre); /** comme vu plus haut, on a d = 2a + b */
            nombre = nouveau;
        }

    }while(nouveau < MAX);

    printf("%.f", somme);

    getchar();
    return 0;
}

edit: include inutile virée...
Édité le 24/02/2009 à 18:12:35 par IATGOF
Hors ligne Jaloyan1 # Posté le 24/02/2009 à 17:41:13
Sms = portable,forum = clavier
Avatar

Citation : pknzeta
Citation : Jaloyan1
On se rends compte que dans ce cas là goto est très pratique(je ne connais pas d'autres moyen pour arrêter la boucle à temps)

etbreak; non?


Désolé j'ai jamais su que break pouvait faire cela.

En effet, faudrait que j'apprenne à m'en servir.

Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir.
:D int x = 0; x >?= (a < b)?((a < c)?((a < d)?a:d):((c < d)?c:d)):((b < c)?((b < d)?b:d):((c < d)?c:d));
Quelqu'un a compris ce que ce code fait? :-°
 
Hors ligne candide # Posté le 24/02/2009 à 18:05:34
"In C ode we trust"
Avatar

Merci de votre participation.


Jaloyan : ton code est super compliqué et avec les goto, c'est la totale !!

Il existe plusieurs niveaux de codage d'un exo tel que celui proposé. Ou bien on se contente d'un code qui marche sur son propre PC mais pas sur celui du voisin ou bien on écrit quelque chose de général qui répond à des problèmes qui n'existent pas pour nous mais que d'autres pourraient rencontrer.

Bon je suis adepte de la simplicité donc voici le code que j'avais écrit :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

#define LIMITE 4000000

int main(void)
{
    int x = 1, y = 2, z;
    int s = y;

    while ((z = x + y) <= LIMITE)
    {
        if (z%2==0)
            s += z;
        x = y;
        y = z;
    }

    printf("%d\n", s);

    return 0;
}


Maintenant, on pourrait le modifier sur plusieurs points :

1°) écrire une fonction qui prend en entrée la valeur limite et retourne la somme demandée ;
2°) qui sait si les int auront une capacité suffisante ? En général, ce ne sera pas le cas. Donc il serait préférable de coder avec des unsigned long. Qui sait si leur taille suffira ? Il faudrait donc un test d'overflow.

Sinon, il n'est pas improbable qu'il existe une astuce pour obtenir le résultat.



 
Hors ligne Gambit2099 # Posté le 24/02/2009 à 18:08:37
Crow never dies...
Avatar

études : IIM

Citation : Pas de titre
Il faudrait donc un test d'overflow.

Comment ?

Mon Blog-Art (dessins, recherches, croquis)
Mon compte Dailymotion (animations, montage vidéo)
A quoi je ressemble: Clique!
Stop à la pop-programmation !

 
Hors ligne Floooder # Posté le 24/02/2009 à 18:13:17

Methode naïve :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
int sum_fibo( int max )
{
    volatile int a = 1, b = 2, c;
    volatile int sum = 0;

    while ( b < max )
    {
        sum += (b%2)? 0 : b;
        c = b;
        b += a;
        a = c;
    }
    return sum;
}


Citation
On se rends compte que dans ce cas là goto est très pratique(je ne connais pas d'autres moyen pour arrêter la boucle à temps)

Peut être en structurant mieux son code... si y'a un test dans le while c'est pas pour rien hein ;)

D'autre part je ne comprends vraiment pas ton code o_O

Et la methode rapide :
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
int sum_fibo( int max )
{
    volatile int a = 1, b = 2;
    volatile int sum = 0;

    while ( b < max )
    {
        sum += b;
        a = a + 2*b;
        b = 2*a - b;
    }
    return sum;
}

Édité le 24/02/2009 à 18:24:45 par Floooder
Hors ligne IATGOF # Posté le 24/02/2009 à 18:17:30
Inspecteur Sablo-Vaginos
Avatar

Ville : Talence
Pays : France métropolitaine
études : EPITECH Bordeaux

Citation : Gambit2099
Citation : Pas de titre
Il faudrait donc un test d'overflow.

Comment ?

Si on renvoie la somme sous la forme d'un int, c'est assez simple en fait, il suffit de déclarer un double et de lui faire subir les mêmes opérations. Si notre double est plus grand que INT_MAX, c'est qu'il y a dépassement ;)
Hors ligne Gambit2099 # Posté le 24/02/2009 à 18:25:46
Crow never dies...
Avatar

études : IIM

Citation : IATGOF
Citation : Gambit2099
Citation : Pas de titre
Il faudrait donc un test d'overflow.

Comment ?

Si on renvoie la somme sous la forme d'un int, c'est assez simple en fait, il suffit de déclarer un double et de lui faire subir les mêmes opérations. Si notre double est plus grand que INT_MAX, c'est qu'il y a dépassement ;)


J'y ai pensé mais alors l'overflow est créé.
"Si notre double est plus grand que INT_MAX, c'est qu'il y a dépassement" A ce moment là le int est déjà assigner la valeur trop grande : utilité ? Et ensuite s'il n'est pas plus grand que INT_MAX on l'assigne à INT et non pas au double ? Ca me semble vraiment archaïque et inutile comme technique oO

Mon Blog-Art (dessins, recherches, croquis)
Mon compte Dailymotion (animations, montage vidéo)
A quoi je ressemble: Clique!
Stop à la pop-programmation !

 
Hors ligne candide # Posté le 24/02/2009 à 18:53:51
"In C ode we trust"
Avatar

Citation : Gambit2099
Citation : Pas de titre
Il faudrait donc un test d'overflow.

Comment ?


Pour savoir tu peux ajouter y à x sans overflow, tu fais un test du genre :

Code : C
1
2
3
4
5
6
#include <limits.h>

    if (y > INT_MAX - x)
        {/*alors dépassement*/}
    else
        z=x+y;


 
Hors ligne Gambit2099 # Posté le 24/02/2009 à 19:04:04
Crow never dies...
Avatar

études : IIM

Et tu mettrais quoi alors s'il y a dépassement ?

Mon Blog-Art (dessins, recherches, croquis)
Mon compte Dailymotion (animations, montage vidéo)
A quoi je ressemble: Clique!
Stop à la pop-programmation !

 
Hors ligne candide # Posté le 24/02/2009 à 19:07:54
"In C ode we trust"
Avatar

Citation : Gambit2099
Et tu mettrais quoi alors s'il y a dépassement ?


Code : C
1
exit(EXIT_FAILURE) ;


;)


 
Hors ligne Gambit2099 # Posté le 24/02/2009 à 19:17:27
Crow never dies...
Avatar

études : IIM

Je m'en douté :p

Mon Blog-Art (dessins, recherches, croquis)
Mon compte Dailymotion (animations, montage vidéo)
A quoi je ressemble: Clique!
Stop à la pop-programmation !

 
Hors ligne Jaloyan1 # Posté le 24/02/2009 à 19:22:11
Sms = portable,forum = clavier
Avatar

Citation : Gambit2099
Je m'en douté :p


Je m'en doutais

Merci.
Édité le 24/02/2009 à 19:22:38 par Jaloyan1

Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir.
:D int x = 0; x >?= (a < b)?((a < c)?((a < d)?a:d):((c < d)?c:d)):((b < c)?((b < d)?b:d):((c < d)?c:d));
Quelqu'un a compris ce que ce code fait? :-°
 
Hors ligne Gambit2099 # Posté le 24/02/2009 à 19:23:42
Crow never dies...
Avatar

études : IIM

Citation : Jaloyan1
Citation : Gambit2099
Je m'en douté :p


Je m'en doutais

Merci.


kthxbye.

Mon Blog-Art (dessins, recherches, croquis)
Mon compte Dailymotion (animations, montage vidéo)
A quoi je ressemble: Clique!
Stop à la pop-programmation !

 
Hors ligne Jaloyan1 # Posté le 24/02/2009 à 20:29:33
Sms = portable,forum = clavier
Avatar

kthxbye. ?


Ça veut dire quoi?

Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir.
:D int x = 0; x >?= (a < b)?((a < c)?((a < d)?a:d):((c < d)?c:d)):((b < c)?((b < d)?b:d):((c < d)?c:d));
Quelqu'un a compris ce que ce code fait? :-°
 
Hors ligne Gambit2099 # Posté le 24/02/2009 à 20:35:30
Crow never dies...
Avatar

études : IIM

k = ok
thx = thanks
bye = aurevoir

C'est souvent utilisé pour dire "ok merci mais j'm'en fous, bye".
Google la prochaine fois ;o)

Mon Blog-Art (dessins, recherches, croquis)
Mon compte Dailymotion (animations, montage vidéo)
A quoi je ressemble: Clique!
Stop à la pop-programmation !

 
Hors ligne ok # Posté le 24/02/2009 à 20:43:42
#!/bin/sh
Avatar

études : BTS IG Évry

Quelle gentillesse :lol: (ça me fait marrer les réponses directes comme ça) !

Sinon bah je suis en train de réfléchir à une solution ...
Édité le 24/02/2009 à 21:21:30 par ok
 
Hors ligne zx-spectrum # Posté le 24/02/2009 à 20:44:39
http://www.worldofspectrum.org
Avatar

bonjour,
Merci Candide pour cet exo, et je vous propose ma solution.
Avant de mettre un code, je vais d'abords expliquer comment j'ai étudier le problème.
la suite comment on l'obtient ?

soit :
U0 = 0
U1 = 1
on obtient les elements suivants :
U2 = U0 + U1
U3 = U2 + U1
U4 = U3 + U2

Un = (Un-1) + (Un-2)

Et on s'arrete quand Un <= 4 000 000
le calcul de la somme

la somme s'obtient en additionnant les nombres pairs.
Un nombre est pair quand le reste de la division par 2 est egal à zero, ce qui revient à effectuer comme operation "%2"

qu'elle structure je vais employer

Avec les tableaux se seraient facile , car pour avoir les nombres de la suite,
il suffirait d'ecrire par exemple :
tab[i] = tab[i-1] + tab[i-2] ou i serait un indice.
Sauf que je ne sais à priori quel serait la dimension de mon tableau !

D'autre part on me demande uniquement de les afficher,pas de les stocker !

Donc je vais utiliser que 3 variables U0,U1,U2 de type entier pour la suite, et une variable somme de type entier.

D'ou mon code ci-dessous :
Secret (cliquez pour afficher)
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
#include <stdio.h>
#include <stdlib.h>
#define maximum 4000000

/* solution propose par zx_spectrum */
int main()
{
    int somme =0;
    int U0=1,U1=1,U2=0;
     printf("Exercice d'Euler propose par Candide\n");
    printf ("0 %d ",U1);
    while (U2 <= maximum)
    {
        U2 = U1 +U0;
        if (((U2 % 2)== 0) && (U2 < maximum))
        {
            somme = somme + U2;
        }

        printf("%d ",U2);
        U0=U1;
        U1=U2;
    }

    printf("\n la somme demandee est : %d",somme);



    return 0;
}

à l'execution j'ai comme resultat :
Code : Bash
1
2
3
4
5
6
7
Exercice d'Euler propose par Candide
0 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 2
8657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702
887
 la somme demandee est : 4613732
Process returned 0 (0x0)   execution time : 0.125 s
Press any key to continue.


Voilà est ce bon ?
@+

Édité le 24/02/2009 à 20:47:13 par zx-spectrum
Hors ligne ok # Posté le 24/02/2009 à 21:30:38
#!/bin/sh
Avatar

études : BTS IG Évry

Bon voici ma solution ... je l'adapterais si quelque chose ne va pas pour l'instant je ne suis pas encore sur.

Secret (cliquez pour afficher)
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main(void)
{
    int max=4000000, Ua=1, Ub=2, Un, somme=0;
    Un=Ua+Ub; /* 3e terme = somme des 2 termes précédant */
    while (Un<=max)
    {
        Un+=Ub; /* "nouveau Un" = Un + Ub (termes précédant) */
        Ub=Un-Ub; /* Ub vaut ensuite le terme de la suite qui précède le "nouveau Un" */
        if ((Un % 2)== 0) /* si le reste de la division de Un par 2 vaut 0, autrement dit, si Un est pair*/
        {
            somme+=Un; /* somme=somme + Un */
        }
    }
    printf ("somme=%d\n", somme); 
    return 0;
}


Edit : je n'obtient pas tout à fait le même résultat qu'avec d'autres solutions ... pourquoi ? (j'y réfléchis).

Edit : c'est bon code corrigé de toutes erreurs...
Édité le 25/02/2009 à 15:31:51 par ok
 
Hors ligne May_Hop # Posté le 24/02/2009 à 21:34:15
Avatar

Par contre l'énoncé dit que la somme doit être inférieur à 4 000 000.
Donc trouver 4613732 est faux, non ?

Secret (cliquez pour afficher)
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
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

#define MAX 4000000

int main (void)
{
    int u1 = 1, u2 = 2;
    int temp;
    int somme = 0;

    while (u2 <= MAX) { /* corrigé */
        if (u2 % 2 == 0) {
            if (somme + u2 > INT_MAX)
                exit (EXIT_FAILURE);
            else
                somme += u2;
        }
        temp = u2;
        u2 += u1;
        u1 = temp;
    }

    printf ("somme : %d\n", somme);

    return 0;
}

Code : Console
somme : 1089154



Édité le 24/02/2009 à 21:50:32 par May_Hop
Hors ligne IATGOF # Posté le 24/02/2009 à 21:36:12
Inspecteur Sablo-Vaginos
Avatar

Ville : Talence
Pays : France métropolitaine
études : EPITECH Bordeaux

@ok:
C'est quoi l'intérêt de mettre des variables globales ici? D'inclure stdlib? De spécifier des paramètres pour main?

@May_Hop: Ce n'est pas la somme qui doit être inférieure à 4000000

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

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