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