jQuery
En savoir plus
Développement Android
En savoir plus
Adobe Flex & Flash
En savoir plus

| Page 1 2 3 4 Suivante | |||||||
| Auteur | Message | ||||||
|---|---|---|---|---|---|---|---|
| 1 visiteur sur ce sujet (1 Anonyme) | |||||||
| Page 1 2 3 4 Suivante | |||||||
candide
|
# Posté le 24/02/2009 à 15:41:11 | ||||||
"In C ode we trust"![]()
|
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.
|
||||||
| Publicité | # Posté le 24/02/2009 à 15:41:11 | ||||||
|
|
|||||||
Varmin
|
# Posté le 24/02/2009 à 16:15:55 | ||||||
Sms = portable,forum = clavier![]()
|
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. 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? |
||||||
candide
|
# Posté le 24/02/2009 à 16:31:24 | ||||||
"In C ode we trust"![]()
|
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.
|
||||||
Catsoulet
|
# Posté le 24/02/2009 à 16:43:56 | ||||||
Vieux mais mouelleux![]()
Ville : Nantes |
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... |
||||||
Nyblas
|
# Posté le 24/02/2009 à 16:48:29 | ||||||
![]()
|
Voila voila ... Fait vite fait, mais qui semble donner le bon résultat.
Secret (cliquez pour afficher) Code : C
EDIT : edité selon la remarque de Jaloyan (un && et un define rajouté)
Édité
le 24/02/2009 à 17:12:22
par Nyblas
|
||||||
GurneyH
|
# Posté le 24/02/2009 à 16:53:12 | ||||||
![]()
|
Salut,
Voici la solution que j'ai donné à ce problème. Secret (cliquez pour afficher) Code : C
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
|
||||||
Varmin
|
# Posté le 24/02/2009 à 16:59:04 | ||||||
Sms = portable,forum = clavier![]()
|
@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
Voilà code vite fait. EDIT : Voici la nouvelle version de mon code. Code : C
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 Varmin
Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. 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? |
||||||
Nyblas
|
# Posté le 24/02/2009 à 17:10:42 | ||||||
![]()
|
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).
|
||||||
pknzeta
|
# Posté le 24/02/2009 à 17:19:11 | ||||||
Every one love the hypnotoad![]()
|
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
|
||||||
Gambit2099
|
# Posté le 24/02/2009 à 17:23:23 | ||||||
|
Crow never dies...
Études : IIM |
avec limite à 100:
Code : Console
avec limite à 4 000 000: Code : Console
code (j'ai été droit au but et n'oublions pas que j'aime la simplicité..): Secret (cliquez pour afficher) Code : C
Édité
le 24/02/2009 à 17:34:24
par Gambit2099
|
||||||
IATGOF
|
# Posté le 24/02/2009 à 17:28:28 | ||||||
![]()
Études : Epitech Bordeaux |
Voici mon implémentation avec méthode commentée.
Secret (cliquez pour afficher) Code : C
edit: include inutile virée...
Édité
le 24/02/2009 à 18:12:35
par IATGOF
|
||||||
Varmin
|
# Posté le 24/02/2009 à 17:41:13 | ||||||
Sms = portable,forum = clavier![]()
|
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. 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? |
||||||
candide
|
# Posté le 24/02/2009 à 18:05:34 | ||||||
"In C ode we trust"![]()
|
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
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.
|
||||||
Gambit2099
|
# Posté le 24/02/2009 à 18:08:37 | ||||||
|
Crow never dies...
Études : IIM |
Citation : Pas de titre
Il faudrait donc un test d'overflow. Comment ? |
||||||
Floooder
|
# Posté le 24/02/2009 à 18:13:17 | ||||||
|
|
Methode naïve :
Code : C
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 ![]() Et la methode rapide : Code : C
Édité
le 24/02/2009 à 18:24:45
par Floooder
|
||||||
IATGOF
|
# Posté le 24/02/2009 à 18:17:30 | ||||||
![]()
É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
|
||||||
Gambit2099
|
# Posté le 24/02/2009 à 18:25:46 | ||||||
|
Crow never dies...
É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 |
||||||
candide
|
# Posté le 24/02/2009 à 18:53:51 | ||||||
"In C ode we trust"![]()
|
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
|
||||||
Gambit2099
|
# Posté le 24/02/2009 à 19:04:04 | ||||||
|
Crow never dies...
Études : IIM |
Et tu mettrais quoi alors s'il y a dépassement ?
|
||||||
candide
|
# Posté le 24/02/2009 à 19:07:54 | ||||||
"In C ode we trust"![]()
|
Citation : Gambit2099
Et tu mettrais quoi alors s'il y a dépassement ? Code : C
|
||||||
Gambit2099
|
# Posté le 24/02/2009 à 19:17:27 | ||||||
|
Crow never dies...
Études : IIM |
|||||||
Varmin
|
# Posté le 24/02/2009 à 19:22:11 | ||||||
Sms = portable,forum = clavier![]()
|
Citation : Gambit2099
Je m'en douté ![]() Je m'en doutais Merci.
Édité
le 24/02/2009 à 19:22:38
par Varmin
Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. 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? |
||||||
Gambit2099
|
# Posté le 24/02/2009 à 19:23:42 | ||||||
|
Crow never dies...
Études : IIM |
|||||||
Varmin
|
# Posté le 24/02/2009 à 20:29:33 | ||||||
Sms = portable,forum = clavier![]()
|
kthxbye. ?
Ça veut dire quoi? Si quelqu'un vous dit : "Je me tue à vous le répéter", laissez-le mourir. 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? |
||||||
Gambit2099
|
# Posté le 24/02/2009 à 20:35:30 | ||||||
|
Crow never dies...
É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) |
||||||
ok
|
# Posté le 24/02/2009 à 20:43:42 | ||||||
|
#!/bin/sh
Études : CNAM |
Quelle gentillesse
(ç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
OS utilisés couramment : CentOS, Fedora, Suse, Kubuntu, Windows Langages utilisés : C, Java, PHP, JS, xHTML/CSS, Bash, SQL, PL/PgSQL, Perl SGBD utilisés : PostgreSQL, MySQL Méthodes d'analyse et langages de conception connus : Merise, UML => Liens : InfosLinux (mon site) | Exercices Bash (dvp.com) |
||||||
zx-spectrum
|
# Posté le 24/02/2009 à 20:44:39 | ||||||
http://www.worldofspectrum.org![]()
|
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
à l'execution j'ai comme resultat : Code : Bash
Voilà est ce bon ? @+
Édité
le 24/02/2009 à 20:47:13
par zx-spectrum
|
||||||
ok
|
# Posté le 24/02/2009 à 21:30:38 | ||||||
|
#!/bin/sh
Études : CNAM |
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
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
OS utilisés couramment : CentOS, Fedora, Suse, Kubuntu, Windows Langages utilisés : C, Java, PHP, JS, xHTML/CSS, Bash, SQL, PL/PgSQL, Perl SGBD utilisés : PostgreSQL, MySQL Méthodes d'analyse et langages de conception connus : Merise, UML => Liens : InfosLinux (mon site) | Exercices Bash (dvp.com) |
||||||
May_Hop
|
# Posté le 24/02/2009 à 21:34:15 | ||||||
![]()
|
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
Code : Console
Édité
le 24/02/2009 à 21:50:32
par May_Hop
|
||||||
IATGOF
|
# Posté le 24/02/2009 à 21:36:12 | ||||||
![]()
É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
