Sad*_*ean 7 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,我们应该打印“数字是幸运的!” 如果不是,它将陷入无限循环,我们应该打印“数字不幸运!”。
现在困扰我的是,如果它陷入无限循环,他们如何期望我们打印“数字不幸运”?
是否可能是编写和设计不佳的任务/问题,或者实际上有一种基本级别的知识方法来检测和停止无限循环?
这是我的代码(没有无限循环检测):
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Era*_*ran 10
一般来说,没有解决停机问题的方法。
但是,在您的特定情况下,我可以想到一种检测无限循环的方法。在每次迭代中,您计算一个数字(数字或前一个数字的平方和)。你可以把所有这些数字放在一个集合中。如果在某些迭代中您计算出该集合中已有的数字,则您知道自己陷入了无限循环。
由于最大平方和是有界的(对于具有 n 位数字的数字,最大数字平方和为 81*n),因此您将在迭代中获得的不同值的数量相对较少,因此如果您没有达到 1 并以成功结束,您将达到之前已经出现的值并报告失败。
| 归档时间: |
|
| 查看次数: |
16666 次 |
| 最近记录: |