Aider moi a résoude cet excercies

Signaler
Messages postés
2
Date d'inscription
mercredi 20 janvier 2010
Statut
Membre
Dernière intervention
20 janvier 2010
-
Messages postés
21
Date d'inscription
dimanche 15 novembre 2009
Statut
Membre
Dernière intervention
1 mai 2010
-
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.

5 réponses

Messages postés
15192
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 décembre 2021
101
Règlement
Règle 7: quels sont les détails qui te posent problèmes?


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
2
Date d'inscription
mercredi 20 janvier 2010
Statut
Membre
Dernière intervention
20 janvier 2010

merci pour votre reponse


j'ai pas arriver a comprendre comment je peux utiliser modulo


je suis encore etudiant et c'est un devoir "homework" pour moi merci pour votre aide
Messages postés
15192
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 décembre 2021
101
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...
Messages postés
96
Date d'inscription
mercredi 23 novembre 2005
Statut
Membre
Dernière intervention
7 mars 2011

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
Messages postés
21
Date d'inscription
dimanche 15 novembre 2009
Statut
Membre
Dernière intervention
1 mai 2010

#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)