Python 当数字不是快乐数字时,何时停止
快乐数由以下过程定义。从任何正整数开始,将数字替换为其数字的平方和,然后重复此过程,直到数字等于1 但当数字不是一个快乐的数字时,它会在一个不包含1的循环中无休止地循环 我已经用python编写了快乐数字问题,但问题是当一个数字不快乐时,如何停止迭代循环。因为它不会以1结尾,并且会不断重复自己Python 当数字不是快乐数字时,何时停止,python,algorithm,Python,Algorithm,快乐数由以下过程定义。从任何正整数开始,将数字替换为其数字的平方和,然后重复此过程,直到数字等于1 但当数字不是一个快乐的数字时,它会在一个不包含1的循环中无休止地循环 我已经用python编写了快乐数字问题,但问题是当一个数字不快乐时,如何停止迭代循环。因为它不会以1结尾,并且会不断重复自己 def happynumber(number): while(number!=1): numberstr = str(number) #converting a number to string
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的循环。A可能是存储数字的好地方。只要当前数字超过3位,它的值在下一次迭代中就会减小。当数字有3位数字时,它在下一次迭代中可以接受的最大值是3*81您可以使用恒定的内存量检测不满意的数字。根据,对于任何正整数起始点,序列将在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)
若给定的数字是快乐数,此方法将返回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;
}
publicstaticbooleanishappy(int-n){
Set seen=新的HashSet();
而(n!=1){
int电流=n;
整数和=0;
while(当前!=0){
总和+=(当前%10)*(当前%10);
电流/=10;
}
如果(见包含(总和)){
返回false;
}
见。加(和);
n=总和;
}
返回true;
}
你能告诉我们你做了什么吗?你必须想办法检测并打破这个循环。这对家庭作业来说应该足够了序列在重复或达到1之前的持续时间是否有限制?(我想不会,在这种情况下,这是一个很难解决的问题。)@AndrewJaffe,我希望有一个明确的限制。序列不可能永远增长——一旦超过某个大小,x的数字的平方和总是小于x本身。因此,对于任何起始数字,序列肯定会在有限步数后开始循环。是的,它会重复自身,但对于不同的数字,它会有所不同。Python的整数类型是任意精度的。@DSM谢谢!我不知道。修正了我的答案。我认为这是教学中最好的答案,因为它是最普遍的,并且对快乐数的特定属性的依赖性最小。@PierreGM:如果在步骤I
中,你得到的幂是步骤j
中值的10倍,然后步骤i+1
将等于步骤j+1
,这是序列中前面的另一个数字。因此,没有必要特别关注这种情况,您可以再等一步,然后找到循环。