0

快乐数由以下过程定义。从任何正整数开始,将数字替换为其数字的平方和,然后重复该过程,直到数字等于 1。

但是当数字不是一个快乐的数字时,它会在一个不包括 1 的循环中无限循环。

我在 python 中编写了快乐数字问题,但问题是当数字不快乐时,我怎么能停止迭代循环。因为它不会以 1 结束,并且会不断重复。

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
4

4 回答 4

16

您可以使用恒定的内存量来检测不满意的数字。根据Wikipedia,对于任何正整数起点,序列将在 1 处终止,或在 处永远循环4, 16, 37, 58, 89, 145, 42, 20, 4。由于不存在其他循环,因此很容易测试不快乐。

def isHappy(x):
    while True:
        if x == 1:
            return True
        if x == 4:
            return False
        x = nextNumberInSequence(x)
于 2012-10-01T15:10:26.467 回答
8

您必须记录到目前为止您在序列中产生的所有数字,如果其中一个第二次出现,您知道您有一个永远不会达到 1 的循环。一可能是一个不错的选择存放数字的地方。

于 2012-10-01T14:54:12.847 回答
2

只要当前数字超过 3 位,它的值在下一次迭代中减小。当数字有 3 位时,下一次迭代可以取的最大值是 3*81 <= 250。所以使用大小为 250 的数组,记录序列中小于 250 的所有数字。然后您可以轻松检测是否有重复。

于 2012-10-01T14:58:51.467 回答
0

如果给定的数字是快乐数字,则此方法将返回 true ,否则将返回 false。我们在这里使用 set 来避免无限循环的情况。

输入:19

输出:真

解释:

1*1 + 9*9 = 82

8*8 + 2*2 = 68

6*6 + 8*8 = 100

1*1 + 0*0 + 0*0 = 1

     public static boolean isHappy(int n) {

          Set<Integer> seen = new HashSet<Integer>();

          while(n != 1) {
            int current = n;
            int sum = 0;
            while(current != 0) {
                sum += (current % 10) * (current % 10);
                current /= 10;
            }

            if(seen.contains(sum)) {
                return false;
            }

            seen.add(sum);
            n = sum;
        }

        return true;

    }
于 2019-09-10T07:33:11.493 回答