考虑以下Java程序:
public class RelativelyPrime {
public static void main(String[] args) {
int N = Integer.parseInt(args[0]); // Dimensions of grid
int i, j;
int r; // Remainder when i is divided by j
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
do { // Using Euclidean algorithm
r = i % j;
i = j;
j = r;
} while (r > 0);
if (i == 1) System.out.print("*");
else System.out.print(" ");
}
System.out.println();
}
}
}
该程序打印N×N表(或矩阵,如果您愿意),其中N是命令行参数
如果i和j是相对素数,则(i,j)-entry是*
,如果它们不是相对素数,则是单个空格。例如,当我通过输入java RelativelyPrime 3
来运行程序时,它会无休止地打印*
。为什么会这样?
答案 0 :(得分:3)
您在while循环中更改了i
和j
。
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
int ii = i, jj = j;
do { // Using Euclidean algorithm
r = ii % jj;
ii = jj;
jj = r;
} while (r > 0);
if (ii == 1) System.out.print("*");
else System.out.print(" ");
}
System.out.println();
}
答案 1 :(得分:1)
这是使用调试器可以帮助您解决问题的地方。
在你的循环中,你改变了i
和j
,这意味着它们永远不会到达N
,因此你有一个无限循环。
我建议你不要改变这些变量,而应使用两个新变量,理想情况下是有意义的名称。