Syracuse

zippog

XLDnaute Nouveau
Je réalise une feuille de calcul sur la conjecture de Syracuse (on part d'un entier et on le divise par 2 s'il est pair ou on le multiplie par 3 et on ajoute 1 s'il est impair).
J'aurais besoin de déterminer au bout de combien de termes on retombe sur le 1 pour la première fois, sans tenir compte du 1er terme.

Par exemple:
1-4-2-1-4-2-1.....--->3
6-3-10-5-16-8-4-2-1-4-2-1...--->8
 

Jiheme

XLDnaute Accro
Re : Syracuse

Bonjour Zipog, re wilfried

La formule pour établir ta liste.

le nombre de départ à saisir en A1 cette formule en B1 etirée à l'horizontale et la formule de Wilfried en B2

=SI(EST.PAIR(A1);A1/2;(A1*3)+1)

Cordialement
 

zippog

XLDnaute Nouveau
Re : Syracuse

Merci pour cette réponse (je ne connaissais pas equiv).

Deux petites choses:
- mes données sont dans la colonne A
- equiv semble donner le numéro de ligne (ou de colonne) alors que je souhaite avoir le rang du dernier terme avant 1 (mes données ne commencent pas sur la première ligne de la colonne A)
 

wilfried_42

XLDnaute Barbatruc
Re : Syracuse

re: Jiheme :)

Voici une autre formule (Affiche la valeur avant le 1)

=SI(A1=1;INDEX(A:A;EQUIV(1;A2:A1000;0);1);INDEX(A:A;EQUIV(1;A:A;0)-1;1))

Mais je ne comprends pas, pour arriver à 1, il faut / 2 or seul 2 / 2 arrive à 1, donc la valeur avant le 1 est toujours 2

affiche le n° de ligne juste avant le 1er un

=SI(A1=1;EQUIV(1;A2:A1000;0);EQUIV(1;A:A;0)-1)
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Syracuse

Bonjour le fil :)
J'arrive un peu en retard :eek:, mais je propose quand même ma solution :
Code:
Function Syracuse(Nombre)
Application.Volatile
Dim Résultat As Integer, Compteur As Integer
If Nombre = 1 Then
    Compteur = 3
End If
Résultat = Nombre
Do While Résultat <> 1
If Résultat / 2 = Int(Résultat / 2) Then
    Résultat = Résultat / 2
Else
    Résultat = Résultat * 3 + 1
End If
Compteur = Compteur + 1
Loop
Syracuse = Compteur
End Function
Merci de me dire quand même si ça aurait pu convenir... ;)
Bonne journée :cool:
 

zippog

XLDnaute Nouveau
Re : Syracuse

En fait, j'ai mis mes valeurs dans la colonne B en commençant sur la première ligne.
J'ai donc tapé dans la cellule E1: =EQUIV(1;B2:B200;0) (c'est ce qu'on appelle le temps de vol).
Pour JNP, je ne pas dire, je ne sais pas où taper ça. En tout cas, ça ressemble à ce que je tape sur calculatrice programmable.
 

Pièces jointes

  • Syracuse.xls
    30.5 KB · Affichages: 67
  • Syracuse.xls
    30.5 KB · Affichages: 73
  • Syracuse.xls
    30.5 KB · Affichages: 73

JNP

XLDnaute Barbatruc
Re : Syracuse

Bonjour zippog :),
Ma réponse était plutôt tournée vers ta demande de base: associer le nombre d'étape pour atteindre 1 pour un nombre donné (1->3, 6->8, 2->1, 5->5, 10->6, 11->14, etc.). Alors que ton tableau posté fait le calcul sur un seul nombre. Je te poste mon fichier, tu comprendras mieux.
Bonne journée :cool:
 

Pièces jointes

  • Syracuse.xls
    23.5 KB · Affichages: 74
  • Syracuse.xls
    23.5 KB · Affichages: 78
  • Syracuse.xls
    23.5 KB · Affichages: 81

JNP

XLDnaute Barbatruc
Re : Syracuse

Re :)
Comme toute macro, tu ouvre l'éditeur Visual Basic, tu insère un module, et dedans, tu colles la fonction. Ensuite, elle est utilisable directement dans tes formules (Sub est une macro qui doit être appelée, Function est une fonction qui peut être utilisée soit par une macro, soit dans la formule d'une cellule).
Bon dimanche :cool:
 

zippog

XLDnaute Nouveau
Re : Syracuse

Merci, il faudra que j'étudie cela.

Tant que j'y suis, je cherche la fonction qui permet de récupérer une valeur de rang spécifié.
Je m'explique. Mes valeurs sont dans la colonne A. J'effectue un calcul sur ces valeurs (en fait nb(A:A)/4). Ensuite j'aimerais récupérer le terme correspondant dans la colonne triée par ordre croissant. Par exemple, si j'obtiens 10 (resp. 10,2) j'aimerais récupérer le 10è (resp. le 11ème) terme de la colonne rangée par ordre croissant. Par contre je ne veux pas que les termes de la colonne soit rangée par ordre croissant.
J'espère avoir été clair.

Merci d'avance.
 

Tibo

XLDnaute Barbatruc
Re : Syracuse

Bonjour,

Si tu n'as pas de doublons, la solution est peut-être du côté de la fonction PETITE.VALEUR

=PETITE.VALEUR(plage_cellules;10)

retourne la 10ème valeur à partir de la plus petite.

Essaye et dis nous

Si pas ça, reviens avec plus de précision, car à vrai dire, j'ai eu un peu de mal à comprendre ce que tu voulais.

@+
 

Statistiques des forums

Discussions
312 765
Messages
2 091 893
Membres
105 086
dernier inscrit
hyacinthe