Salut,

J’essaie de faire cet exercice :

Nom : exo.PNG
Affichages : 157
Taille : 9,1 Ko

J'ai fait ce code :

Code phyton : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
def trouverK1(n):
    k = 0
    while 1:
        a = k*(k+1)/2
        b = (k+1)*(k+2)/2
 
        if a <= n and n < b:
            print("La valeur de k recherchée est :", k)
            print("On a bien : %d <= n(%d) < %d" % (a, n, b))
            break
        k += 1
    print("Fin")

Après je me suis dit qu'on pouvait éviter une division par 2 pour les bornes a et b et du coup je fais la comparaison avec 2n (pour diviser ou multiplier par 2 j'utilise un décalage binaire c'est plus rapide normalement et on travaille avec des entiers).

Code phyton : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
def trouverK2(n):
    k = 0    
    n2 = n << 1  # n2 = 2 * n
    while 1:
        a = k*(k+1)
        b = (k+1)*(k+2)
 
        if a <= n2 < b:
            print("La valeur de k recherchée est :", k)
            print("On a bien : %d <= n(%d) < %d" % (a >> 1, n, b >> 1))
            break
        k += 1
    print("Fin")
on peut probablement optimiser encore (en évitant de commencer à k=0 par exemple...) mais bon ...

Mais je n'ai pas compris la dernière question "Encadrer le nombre d’itération en fonction de n"...

Qu'en pensez-vous ?