youssef311
Messages postés2Date d'inscriptionmercredi 20 janvier 2010StatutMembreDernière intervention20 janvier 2010
-
20 janv. 2010 à 02:04
noname001
Messages postés21Date d'inscriptiondimanche 15 novembre 2009StatutMembreDernière intervention 1 mai 2010
-
19 mars 2010 à 18:01
je suis debutant en c++
pouvez vous m'aider a resoudre cet excercice merci d'avance
A un entier n strictement positif on associe n/2 si n est pair et 3n+1 si n est impair. En réappliquant cette transformation à l'entier obtenu, on définit un algorithme dit de Syracuse. On admettra que pour tout entier strictement positif de départ on finisse toujours par arriver à 1.
On demande d'écrire un programme qui, pour une valeur de départ proposée par l'utilisateur, affiche la liste des entiers obtenus jusqu'à 1, ainsi que le nombre de fois qu'il est nécessaire d'appliquer la transformation pour y arriver (ou, si l'on part de 1, pour y revenir).
Voici un exemple de déroulement de cet algorithme :
Valeur de départ (entier strictement positif) ? 12
6 3 10 5 16 8 4 2 1
On doit appliquer 9 fois la transformation avant d'arriver à 1.
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 20 janv. 2010 à 14:05
l'opérateur modulo (%) te donne le reste de la division.
Si, par exemple, tu divise par 2 (au hasard ) et que tu regarde le reste, tu as soit 0, soit 1:
- 1%2 1, 3%2 1, ...
- 2%2 0, 4%2 0, ...
Tu vois ce que cela te permet de trouver?
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
cs_neone
Messages postés96Date d'inscriptionmercredi 23 novembre 2005StatutMembreDernière intervention 7 mars 2011 22 févr. 2010 à 13:21
pour plus généralisé au lieu de 3n+1 tu fais an+b a et b premiers.
sinon voila une fonction vite fait :
void Syracuse(int *n)
{
int a=0;
if(n%2==0)
{
a=n/2;
}
else
{
a=3*n+1;// pour l'optimiser écrit direct a=(3*n+1)/2;
}
cout<<"valeur atteinte"<<a<<endl;
printf("valeur atteinte %d",a);
Syracuse(&a)
}
amuse toi. je viens de l'écrire donce a toi de compiler et de faire ton main. boncourage
Vous n’avez pas trouvé la réponse que vous recherchez ?
noname001
Messages postés21Date d'inscriptiondimanche 15 novembre 2009StatutMembreDernière intervention 1 mai 2010 19 mars 2010 à 18:01
#include
using namespace std;
int main()
{
int n,nbr_transformation=0;
cin >> n; //nbr utilisateur
while ( n != 1)
{
if (n%2 == 0) // Si il est pair
{
n /= 2;
}
else n = 3*n + 1; // Impair
cout << n << " "; // affiche les valeurs
nbr_transformation++;
}
cout << "Nombre de transformations: " << nbr_transformation << endl;
return 0;
}
Comme dit plus haut, le modulo te sert à vérifier si le nbr est pair ou impair. Le reste se fait par une simple boucle et un compteur pour avoir le nombre de modifications faites(donc de tours de boucle)