什么时候停止数字不是一个快乐的数字

时间:2012-10-01 14:51:22

标签: python algorithm

幸福的数字由以下过程定义。从任何正整数开始,将数字替换为其数字的平方和,并重复该过程,直到数字等于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 个答案:

答案 0 :(得分:11)

您可以使用恒定的内存量检测不满意的数字。根据{{​​3}},对于任何正整数起点,序列将终止于一,或永远在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)

答案 1 :(得分:7)

你必须记录你到目前为止在序列中产生的所有数字,并且如果其中一个数字第二次出现,你知道你有一个永远不会达到1的循环。{{3}对于存储数字的地方来说,这可能是个不错的选择。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

输入:19

输出:true

说明:

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;

    }