所以我在课堂上写了一个嵌套的while循环来计算z的值。我需要同时输出z和花费的时间。
这是结果
public class TimeWhile {
public static void main(String[] args) {
int n = 100000;
int z = 1;
long startTime = System.currentTimeMillis();
int x = 0;
while (x <= n) {
int y = 0;
while (y <= n) {
z = x * y;
y++;
}
x++;
}
long endTime = System.currentTimeMillis();
long elapsed = endTime - startTime;
System.out.println("The time is " + elapsed);
System.out.println("The number is " + z);
}
}
第二次while循环
public class TimeWhile {
public static void main(String[] args) {
int n = 100000;
int z = 1;
long startTime = System.currentTimeMillis();
int x = 0;
int y = 0;
while (x <= n) {
while (y <= n) {
z = x * y;
x++;
y++;
}
}
long endTime = System.currentTimeMillis();
long elapsed = endTime - startTime;
System.out.println("The time is " + elapsed);
System.out.println("The number is " + z);
}
}
为什么第二个运行得更快?输出“ z”相同。
答案 0 :(得分:2)
在第一个循环中,y
的值始终分配给每个zero
上的iteration
,从而在第二个循环中将花费更多的时间和步骤来达到n
循环,y
不会重置为zero
,因此到达n的速度更快,步数也更少。
loop1
while (x <= n) {
int y = 0;
loop2
while (x <= n) {
while (y <= n) {
z = x * y;
x++;
y++;
}
答案 1 :(得分:2)
我相信此代码有很多错误之处。
首先,每次循环时都不需要计算z = x * y
,但是最后一次迭代将覆盖该值。因此,您的代码实际上与以下代码相同:
heatTheUniverseForSomeTime();
int z = n*n;
这意味着z
的输出相同的事实实际上并不意味着循环的工作原理。
第二,int
的类型不足以容纳100000*100000
的值。这就是为什么您拥有1410065408
而不是更多期望的10000000000
的原因。 long
会有所帮助(但请注意,您也应该在右侧向long
至少投射一个参数!)。如果您需要更大的值,请考虑使用BigInteger
。
第三点是,您可以通过使用for
循环来以更常见,更易理解的形式重写您的第一个示例,如下所示:
for(int x = 0; x <= n; x++) {
for(int y = 0; y <= n; y++) {
z = x * y;
}
}
此代码显然总共需要运行n*n
个迭代。
我还相信现在第一点变得更加清晰。
最后,您的第二个代码在2个不同方面并不等效:
如前所述,您永远不会重置y
,因此在第一次内部运行循环运行之后,它再也不会运行
此外,由于您也在内部循环中执行x++;
,这意味着它始终持有x == y
,因此外部循环也不会在第一次迭代后运行。
您的第二个代码实际上与
相同for(int x = 0, y = 0; y <= n && x <= n; x++, y++) {
z = x * y;
}
此代码显然只需要运行n
次,而不是n*n
,运行速度要快得多。
答案 2 :(得分:1)
第二个要快得多,因为您在嵌套的while循环中而不是在外部的while循环中增加x。嵌套的while循环比外部循环运行更多次,因为它将一直重复直到外部循环的条件为false为止。如果将x放在嵌套循环中,它将连续重复多次,使外循环的条件错误更快。