bonjour, j'aurai aimé avoir de l'aide pour un exercice:
comment faire marcher un programme qui renvoie si 2013 est la somme de plusieurs nombres impairs consécutifs ?
merci d'avance pour vos réponses (avec pyzo);)
gloria75
Version imprimable
bonjour, j'aurai aimé avoir de l'aide pour un exercice:
comment faire marcher un programme qui renvoie si 2013 est la somme de plusieurs nombres impairs consécutifs ?
merci d'avance pour vos réponses (avec pyzo);)
gloria75
Salut,
Il faut d'abord écrire (en français) un algorithme qui fabrique ces N nombres impairs consécutifs, en fasse la somme et la compare à 2013. Comme c'est l'ordinateur qui travaille vous pouvez y aller assez bourrin: prendre les nombres impairs < 2013, les découper par tranches de N, en faire la somme, comparer, recommencer avec N+1.
Après vous pouvez faire travailler vos connaissances en arithmétique et dire que si 2013 s'écrit comme la somme de N nombres impairs consécutifs i.e. existe-t-il un "p", tel que tel que p + p + 2 +.... = 2013 ou N*p = 2013 - 2*N ou (2013 - 2*N) / N = p.
Après, il faut juste coder çà avec Python.
- W
Bonjour,
si on veut que n + (n+2) + (n+4) = 2013, on a donc: 3*n+6=2013 et donc n=(2013-6)/3
En conséquence:
=> 2013 a une solution si (2013-6) est divisible par 3, c'est à dire en Python: (2013-6)%3==0
=> et dans ce cas, les nb impairs cherchés sont n=(2013-6)//3=669, n+2=671 et n+4=673
Edit: dans les conditions, il faut bien sûr que n soit impair, ce qui est le cas ici avec 2013, et de façon générale quand le nombre de départ sera impair!
Mais pourquoi a t on n+(n+2) jusqu'à (n+4) ?
Si X est la somme de 3 nombres impairs consécutifs, alors X = n + (n+2) + (n+4)
Si X est la somme de 4 nombres impairs consécutifs, alors X = n + (n+2) + (n+4) + (n+6)
Si X est la somme de 5 nombres impairs consécutifs, alors X = n + (n+2) + (n+4) + (n+6) + (n+8)
Si X est la somme de p nombres impairs consécutifs, alors X = n + (n+2) + (n+4) + .... + (n+2*(p-1))
n, c'est le plus petit nombre impair de la somme. Pour avoir les suivants, il suffit d'incrémenter de 2 à chaque fois.
Mais comment transcrire cela en python ?
On ne va pas faire ton exercice à ta place. wiztricks t'a indiqué comment procéder.
Lache ton ordinateur, prend une feuille et un crayon, et commence par te demander comment tu ferais si tu résolvait ce problème à la main. Ensuite tu pourras transformer ton raisonnement en un algorithme.
Ben vous lancez la console Python et vous essayez de traduire...
On saisit le nombre de départ dans une variable:
On initialise le nombre d'entiers cherchés:Code:>>> n = 2013
On regarde le reste de la formule qu'on vous a donné:Code:>>> k = 2
C'est pas nul, donc çà ne fonctionne pas, on passe au suivant:Code:
1
2 >>> (n - 2*k) % k 1
Voilà qui est mieux et on trouve:Code:
1
2
3 >>> k += 1 >>> (n - 2*k) % k 0
Maintenant, il y a d'autres solutions (avec des k plus grands). Donc il va falloir arranger çà dans une boucle qui regarde s'il y a une solution lorsqu'on incrémente k et qui s'arrête un jour.Code:
1
2 >>> (n - 2*k) // k 669
- W
D'accord merci je vais essayer
J'utilise le "while" mais je ne sais pas quoi mettre comme condition dedans
Si le variant de la boucle est "k" (la variable incrémentée à chaque itération), vous pourriez essayer avec les premières valeurs de "k". La condition serait alors par exemple "k < 10". Cela vous permettra de montrer un code qui fonctionne et réfléchir à une condition plus appropriée.
- W
Bonjour,
En fait, comme c'est souvent le cas, on peut faire plus simple en informatique, à condition de faire un peu plus de maths...
On peut en effet éviter de chercher la solution avec une boucle de recherche: il suffit de généraliser ce que j'ai démontré plus haut avec la somme de 3 nombres impairs consécutifs.
Avec les notations suivantes:
n = le nombre de départ (n=2013 dans le 1er message)
p = nombre de nombres impairs consécutifs dont la somme doit être égal à n
i = le 1er nombre impair
A noter que pour obtenir le nombre impair n, p est forcément un nombre impair! Il n'y a pas de solution pour p=2, 4, 6, ...
Prenons p=5
on doit avoir i + (i+2) + (i+4) + (i+6) + (i+8) = n
ou p*i + p*(p-1) = n
ou i = (n-p*(p-1))//p
On a donc:
Avec n et p: il y a une solution si (n-p*(p-1)) est divisible par p, c'est à dire (n-p*(p-1))%p==0 et dans ce cas, le 1er nombre des p nombres impairs est i=(n-p*(p-1))//p
Et c'est tout!
Application en Python:
On peut aussi calculer la liste des p nombres impairs:Code:
1
2
3
4
5 if (n-p*(p-1))%p==0: i = (n-p*(p-1))//p print("pour n =", n, "et p = ", p, "le 1er nombre de la liste est i = ", i) else: print("pour n =", n, "et p = ", p, "pas de solution")
A titre d'exemples:Code:res = [i+k for k in range(0, 2*(p-1)+1, 2)]
=> on trouve pour n=2013 et p=3: 1 solution [669, 671, 673]
=> on trouve pour n=2025 et p=15: 1 solution [121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149]
Etc...
Edit: petites corrections des formules dans le texte (mais le code est ok)
Ok tres bien, j'ai compris mais comment initialiser p avant de faire la boucle ?
Bonjour,
Je ne sais pas à quoi tu réagis, mais comme ma solution n'a pas de boucle de recherche, ce n'est pas à moi de répondre...
Cependant, cela fait déjà 9 jours que tu es sur ce sujet, tu as eu pas mal d'aides et plusieurs solutions, et tu poses encore des questions très très basiques (initialiser p? => "p=5"). Tu devrais regarder un bon cours sur Python comme celui de Swinnen: https://python.developpez.com/cours/apprendre-python3/. A défaut, tu vas perdre beaucoup de temps à buter sur chaque petit problème.