2012-10-01 2 views
0

Un nombre heureux est défini par le processus suivant. En commençant par n'importe quel nombre entier positif, remplacez le nombre par la somme des carrés de ses chiffres et répétez le processus jusqu'à ce que le nombre soit égal à 1.quand s'arrêter quand le nombre n'est pas un nombre heureux

Mais lorsque le nombre n'est pas un nombre heureux, il boucle indéfiniment dans un cycle qui ne l'est pas. include 1.

J'ai codé le problème du nombre heureux en python mais le problème est quand un nombre n'est pas content, alors comment pourrais-je arrêter le cycle d'itération. car il ne se terminera pas avec 1 et continuera à se répéter.

def happynumber(number): 

while(number!=1): 
    numberstr = str(number) #converting a number to string 
    index=0 
    sum=0 
    while(index!=len(numberstr)): 
     sum = sum + int(numberstr[index])*int(numberstr[index]) 
     index = index+1 
    print sum 

    number = sum 
return number 
+1

Pourriez-vous nous montrer ce que vous avez lu? –

+0

Vous devez penser à un moyen de détecter le cycle et de le casser. Cela devrait suffire à faire des devoirs. ;) –

+0

Y a-t-il une limite à la longueur de la séquence avant qu'elle ne répète ou n'atteigne 1? (Je suppose que non, auquel cas c'est un problème difficile.) –

Répondre

11

Vous pouvez détecter des numéros malheureux avec une quantité de mémoire constante. Selon Wikipedia, pour tout point de départ entier positif, la séquence se terminera à un, ou boucle pour toujours à 4, 16, 37, 58, 89, 145, 42, 20, 4. Puisque aucune autre boucle n'existe, il est facile de tester le malheur.

def isHappy(x): 
    while True: 
     if x == 1: 
      return True 
     if x == 4: 
      return False 
     x = nextNumberInSequence(x) 
7

Vous devez tenir un registre de tous les chiffres que vous avez obtenus jusqu'à présent dans la séquence, et si l'un d'entre eux vient une seconde fois que vous savez que vous avez une boucle qui ne sera jamais atteindre 1. set est probablement un bon choix pour un endroit pour stocker les numéros.

+3

... ou un multiple de 10 d'un nombre déjà enregistré ... –

+1

Je pense que c'est la meilleure réponse à des fins d'enseignement, car c'est la plus générale, et la moins dépendante des propriétés particulières des nombres heureux. – DSM

+0

@PierreGM: si à l'étape 'i' vous obtenez une puissance de 10 fois la valeur à l'étape' j', alors l'étape 'i + 1' sera égale à l'étape' j + 1', qui est un autre nombre de plus tôt dans la séquence. Il n'y a donc pas besoin d'attraper ce cas spécialement, vous pouvez juste attendre un pas de plus et trouver le cycle alors. –

1

Tant que le nombre actuel comporte plus de 3 chiffres, sa valeur diminue à l'itération suivante. Lorsque le nombre a 3 chiffres, la valeur maximale qu'il peut prendre dans l'itération suivante est 3 * 81 < = 250. Donc, utilisez un tableau de taille 250 et enregistrez tous les nombres dans la séquence qui sont inférieurs à 250. Vous pouvez alors facilement détecter si vous avez un doublon.

+0

Le type entier de Python est arbitraire-precision. – DSM

+0

@DSM Merci! Je ne le savais pas. J'ai corrigé ma réponse pour en prendre soin. – krjampani

Questions connexes