java - 无限循环检测

标签 java infinite-loop

我想知道是否可以通过基本的 Java 知识来检测和/或停止无限循环。

我有一项学校任务(考虑到我们的编程知识处于基础水平),我们应该从用户那里获取输入 (int),然后取该数字的数字的平方和(即 123-->1 ^2+2^2+3^2)。然后该结果应该放在一个 while 循环中,它应该重复同样的事情直到它达到 1(即 123-->1^2+2^2+3^2=14-->1^2+4^2 =17-->1^2+7^2 等)

如果我们得到数字 1,我们应该打印“number is lucky!”如果不是,它将陷入无限循环,我们应该打印“number is not lucky!”。

现在让我烦恼的是,如果它会陷入无限循环,他们如何期望我们打印“number is not lucky”?

这可能是编写和设计不当的任务/问题,还是实际上有一种基本知识水平的方法来检测和停止无限循环?


这是我的代码(没有无限循环检测):

import java.util.Scanner;

public class Vezba {

public static void main(String[] args) {
    boolean run = true;
    Scanner sc = new Scanner(System.in);
    int number = sc.nextInt();
    int digits;
    int sum=0;
    int k = 10;
    int j = 1;
    while(run){
        if(number<0){
            run=false;
        }
        int len = String.valueOf(number).length();
       /* Takes out each digit to make the first sum (probably redundant but please ignore)*/
        while(len>0){
            digits = number%k/j;
            j*=10;
            k*=10;
            len--;
            sum += digits*digits;
        }
       /* Repeats the process until sum is 1*/
        while(sum>1){
            int len2 = String.valueOf(sum).length();
            int pom = 1;
            int k1=10;
            while(len2>0){
                digits = sum%k1/pom;
                pom*=10;
                k1*=10;
                len2--;
                sum += digits*digits;
            }
        }
        System.out.println("Number is lucky!");
        run=false;
    }
}  
}

最佳答案

一般来说,没有解决停机问题的方法。

但是,在您的特定情况下,我可以想出一种检测无限循环的方法。在每次迭代中,您计算​​一个数字(数字的平方和或前一个数字)。您可以将所有这些数字放在一个集合中。如果在某些迭代中您计算出一个已经存在于该集合中的数字,您就会知道自己陷入了无限循环。

由于最大平方和是有界的(对于具有 n 位的数字,数字的最大平方和是 81*n),因此您将在迭代中获得的不同值的数量相对较少,所以如果你没有达到 1 并以成功结束,你将达到之前已经出现的值并报告失败。

关于java - 无限循环检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28900124/

相关文章:

java - 如何编写一个 slf4j 记录器,为所有参数添加一个 esapi 过滤器

java - 使用哪个 servlet-api jar

C++ 带输入的无限循环

java.lang.IllegalArgumentException : The servlets named [abc] and [Testing] are both mapped to the url-pattern [/welcome] which is not permitted 异常

java - 保存网页以供离线浏览

java - Blackberry Java 开发 - 递增版本号

assembly - 为什么循环不递减 cx 寄存器?

C++ getline() 读取文件行无限循环遍历文件

javascript - Javascript 无限循环会阻止渲染吗?

http - 在服务器端检测无限 HTTP 重定向循环