Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当数字不是快乐数字时,何时停止_Python_Algorithm - Fatal编程技术网

Python 当数字不是快乐数字时,何时停止

Python 当数字不是快乐数字时,何时停止,python,algorithm,Python,Algorithm,快乐数由以下过程定义。从任何正整数开始,将数字替换为其数字的平方和,然后重复此过程,直到数字等于1 但当数字不是一个快乐的数字时,它会在一个不包含1的循环中无休止地循环 我已经用python编写了快乐数字问题,但问题是当一个数字不快乐时,如何停止迭代循环。因为它不会以1结尾,并且会不断重复自己 def happynumber(number): while(number!=1): numberstr = str(number) #converting a number to string

快乐数由以下过程定义。从任何正整数开始,将数字替换为其数字的平方和,然后重复此过程,直到数字等于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

你必须记录你在序列中产生的所有数字,如果其中一个第二次出现,你就知道你有一个永远不会达到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
,这是序列中前面的另一个数字。因此,没有必要特别关注这种情况,您可以再等一步,然后找到循环。