Je cherche à itérer sur un integer

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous ^^

Je suis entrain de coder un petit script, dans celui-ci je cherche à additionner tous les éléments d'un integer entre eux jusqu'à ce qu'il ne reste plus qu'un seul chiffre. Faire en sorte que par exemple, un int valant 1234 devienne un int valant 1 (soit 1+2+3+4 –> 10 –> 1).

Quelqu'un pour m'aiguiller, merci :)

Édité par Taguan

+0 -0

Salut,
Une solution serait de faire des conversions chaîne/entier (str/int) pour te ramener à quelque chose plus facile à « itérer ». Une autre, sans doute plus formatrice, serait de se demander comment faire une itération (donc comment récupérer 1, 2, 3 et 4 à partir de 1234), par exemple à partir de division euclidienne par 10.

Déjà découpe ton problème.

Le premier truc, c'est de découper ton problème. Ce qui est évident pour Lucas-84 mais pas forcément pour tout le monde.

Le plus dur, c'est de sommer les chiffres d'un nombre. (1+2+3+4 -> 10)

Ensuite, c'est de savoir quand s'arreter.


@elegance : Ça aurait été mieux si l'OP avait trouvé tout seul. Surtout que ta solution est perfectible …

@artragis: Ton code ne marche pas pour des nombres d'un seul chiffre. Idem que elegence, ça aurait été mieux de guider l'OP plutôt que de donner un code tout fait je pense.

Edit: oups mal lu > 0. Et pas > 10, donc aucune erreur …

Édité par ache

ache.one                                                                                   🦊

+5 -0

@ache : Le code que j'ai mis n'est pas le code demandé, loin de là. il se trouve que par une coïncidence 'mathématique', le code que j'ai mis donne le même résultat, et cette propriété a d'ailleurs un nom. Mais l'exercice garde tout son intérêt.

@Kanaal : oui, pour n=0, ma fonction est fausse. C'est le seul cas et ça peux être corrigé facilement.

+0 -0
Auteur du sujet

@Lucas-84 : Pour te répondre j'avais déjà testé la première option mais je bloquais à cause d'une erreur qui survenait "string indices must be integers". Par exemple je parcourais le nombre (transformé en str) et puis j'ajoutais la valeur nombre[i] à un total qui était aussi de type str. Ensuite je renvoyais ce total en integer jusqu'à ce que len(str(nombre)) == 1. Mais je n'ai pas réussi.

@elegance : J'ai testé ta méthode, elle fonctionne en si peu de lignes, je pense la garder.

@artragis : Ton code a l'air de fonctionner mais il me donne en "10" il ne va pas plus loin (?)

Merci à tous pour ces réponses rapides :)

+0 -0

@Lucas-84 : Pour te répondre j'avais déjà testé la première option mais je bloquais à cause d'une erreur qui survenait "string indices must be integers". Par exemple je parcourais le nombre (transformé en str) et puis j'ajoutais la valeur nombre[i] à un total qui était aussi de type str. Ensuite je renvoyais ce total en integer jusqu'à ce que len(str(nombre)) == 1. Mais je n'ai pas réussi.

A priori l'erreur que tu cites veut dire que tu utilisais autre chose qu'un entier pour indexer une chaîne (par exemple dans nombre[i], si jamais i n'est pas un entier). Dans le reste de ce que tu dis, il me semble qu'il y une autre erreur de typage : ajouter un nombre à un total, c'est une opération sur des entiers, donc le total devrait être un entier aussi (et non pas un str). Je te conseille de bien réfléchir avant à ce que devraient être les types de tes variables (intuitivement, les opérations sur un entier ou sur une chaîne sont de natures différentes).

En python, l'avantage est du côté de fonctions nombreuses évitant de réinventer la roue… Certes ça ne retire pas l'algorithme qui représente la solution optimale au problème, mais écrire une fonction évite certaines fois des lignes supplémentaires. La fonction intéressante pour le problème est d'éviter le calcul du reste et du quotient sur deux lignes en une seule ligne,

1
q, r = divmod(value, 10)

q -> quotient

r -> reste

value -> 1234

Cela reste une solution théorique, mais elle n'utilise pas la puissance du langage, on peut faire ce genre de code pour n'importe quel langage, mais tout l'intérêt est d'utiliser la force de chacun.

En python, on peut faire des choses sympa comme le logique mais rapide,

1
2
>>> sum([int(i) for i in "1234"])
10

Mais quand on a une certaine expérience en python, rien ne vaut l'élégant map

1
2
>>> sum(map(int, "1234"))
10

Élégant mais en plus efficace, que du binding C !

Édité par fred1599

+2 -0

Quel était ton objectif ?

Si l'objectif est de calculer la somme des chiffres, jusqu'à obtenir un seul chiffre, alors ma solution est bonne. J'utile une propriété mathématique, qu'on appelle la preuve par 9 (décrite sur Wikipédia et ailleurs).

C'est une solution de matheux, pas d'informaticien.

Si l'objectif était de faire un exercice de programmation, où on demandait explicitement de boucler sur les chiffres et de répéter l'opération tant que nécessaire, alors ma solution est hors-sujet. Il faut faire un truc basé sur la proposition d'Atragis, ou de Fred1599 , mais il faut compléter.

Effectivement, ces 2 propositions font juste une étape, et il faut donc répéter l'opération autant de fois que nécessaire. Et c'est un TRES Bon exercice de programmation que d'essayer de répéter l'opération autant que nécessaire.

+1 -0
Staff

ma méthode te permet d'itérer sur un entier. Si ton but est de réduire au plus possible tu n'as plus qu'à itérer tant que la réduction n'est pas totale.

Ensuite, j'avoue que pour 4 lignes je ne savais pas comment te "guider" je n'ai fait que traduire en python "pour chaque chiffre faire ajouter le chiffre"

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte