Suites de syracuse

Résolu/Fermé
reda.92 Messages postés 5 Date d'inscription dimanche 22 mai 2011 Statut Membre Dernière intervention 24 mai 2011 - 22 mai 2011 à 01:24
reda.92 Messages postés 5 Date d'inscription dimanche 22 mai 2011 Statut Membre Dernière intervention 24 mai 2011 - 24 mai 2011 à 01:01
Bonjour,
slt a tous.
lorsque j'execute ce programme les instructions à partir de la 21eme(en vert) ligne ne s'execute pas y'aurait-il une solution à ca:



#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct
{int un,longueur;
}suite;
int main()
{suite s;
int nb,db;
printf("Donner l'amorce U1\n");
scanf("%d",&s.un);
printf("La suite de syracuse est: %d\n",s.un);
s.longueur=1;
while(s.un!=1&&s.un!=0)
{if(s.un%2==0){s.un=s.un/2;
printf("%d\n",s.un);}
else {s.un=s.un*3+1;
printf("%d\n",s.un);}
s.longueur++;
}printf("La longueur de la suite est: %d\n",s.longueur);
nb=s.longueur;
s.longueur=1;
db=1;
while(s.longueur!=nb)
{s.un=db;
db=db+1;
while(s.un!=1&&s.un!=0)
{if(s.un%2==0){s.un=s.un/2;}
else {s.un=s.un*3+1;}
s.longueur++;
}}
printf("\nLa suite de Syracuse ayant une longueur de %d termes a pour \npremier terme u1 = %d.\n",s.longueur,db-1);
system("PAUSE");
return 0;
}


merci.


5 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 mai 2011 à 15:54
Le problème vient de ton s.longueur++ dans la deuxième boucle
Dans la deuxième boucle imbriquée tu peux l'incrémenter plusieurs fois
Du coup tu peux avoir testé s.longueur<nb puis s.longueur>nb sans jamais tomber sur test.longueur==nb
Modifie ta condition par while(s.longueur<nb) et ça devrait aller
1
reda.92 Messages postés 5 Date d'inscription dimanche 22 mai 2011 Statut Membre Dernière intervention 24 mai 2011
23 mai 2011 à 03:16
oui ca marche merci, mais pour {db-1} il affiche la valeur 7 tjrs quelque soit la valeur que je donne au debut {s.un} qui normalement devrait afficher s.un.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 mai 2011 à 13:54
Il n'affiche pas toujours 7, loin de là ! Cependant il est difficile de savoir quand les résultats obtenus sont bons ou pas puisqu'on ne sait pas ce que tu veux faire, ni pourquoi tu le fais comme ça !!!

db-1 <-- u1 (de 1 à 50)
   0 <-- 1
   2 <-- 2
   3 <-- 3,4,5,6,8,10,16,20,21,32,40,42
   4 <-- 12,13,24,26
   5 <-- 11,17,22,23,34,35,48
   6 <-- 7,9,14,15,18,19,25,28,29,30,36,37,39,44,45,46
   7 <-- 33,39,43,49,50
  14 <-- 27,31,41,47
0
reda.92 Messages postés 5 Date d'inscription dimanche 22 mai 2011 Statut Membre Dernière intervention 24 mai 2011
23 mai 2011 à 21:23
ce que je veux du programme c'est que la valeur (db-1)=U1, sans faire un affectation
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 mai 2011 à 21:50
Tu veux remonter l'algorithme de Syracuse ?
En partant de 1, et avec pour seule information la longueur de la chaîne ?
À vue de nez je dirais qu'il y a 2^longueur résultats possibles !
0
reda.92 Messages postés 5 Date d'inscription dimanche 22 mai 2011 Statut Membre Dernière intervention 24 mai 2011
23 mai 2011 à 22:29
regarde pour mieux comprendre je vais t'ecrire ce qui est demandé:
-ecriver une fonction qui prenant en paramètre l'amorce d'une suite de syracuse, revoie sa longueur (ça je l'ai fais).
-ecrivez alors un programme principale qui, après avoir demandé un entier n, affiche les longueurs des n suites de syracuse d'amorces successives 1,2,3,...,n.
-adaptez le programme precedent pour obtenir à partir de n la longueur maximale des suites d'amorce allant de 1 à n, ainsi que la valeur de la plus petite amorce ayant donné cette longueur maximale. (exemple, pour n=100 000, la plus longue suite contient 351 termes et est obtenu pour l'amorce U1=77 031).
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 mai 2011 à 23:18
En fait le premier point est mal fait car tu n'as pas fait une fonction, tu as tout mis dans le main, et au lieu de calculer juste la longueur tu affiches tous les résultats et ce n'est pas réutilisable.
Il te faut une fonction int longueur(int n) qui prend l'amorce n, et calcule la longueur jusqu'à 1.

En effet dans le deuxième point on ne te demande pas d'afficher toute la suite d'amorce n, mais d'afficher les longueurs obtenues avec la première fonction pour chaque k compris entre 1 et n.

Exemple d'affichage attendu :

Entrez n : 5

k=1 --> longueur=0
k=2 --> longueur=2
k=3 --> longueur=8
k=4 --> longueur=3
k=5 --> longueur=6

Et enfin, le troisième point te demande juste de dire quel est la longueur maximale calculée, et le plus petit des k qui a généré cette longueur.

Exemple d'affichage attendu :

Entrez n : 100000

La longueur maximale est 351 pour k=77031
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
reda.92 Messages postés 5 Date d'inscription dimanche 22 mai 2011 Statut Membre Dernière intervention 24 mai 2011
Modifié par reda.92 le 24/05/2011 à 01:21
j'ai fait les autres point mais pour le deuxieme point je n'ai pas su faire
pourrais tu m'envoyer la boucle??
merci
0