为什么一个嵌套的while循环比另一个嵌套的while循环快?

所以我在课堂上写了一个嵌套的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);


}


}

http://img4.mukewang.com/629b1e5a0001fd8401980042.jpg

第二个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);


}


}

http://img.mukewang.com/629b1e680001fc3201760035.jpg

为什么第二个跑得更快?输出“z”是相同的。



拉风的咖菲猫
浏览 121回答 2
2回答

梦里花落0921

我相信这段代码有很多问题。首先,不需要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++) {&nbsp; &nbsp; for(int y = 0; y <= n; y++) {&nbsp; &nbsp; &nbsp; &nbsp; z = x * y;&nbsp; &nbsp; }}这段代码显然需要n*n总共运行迭代。我也相信现在第 1 点变得更加清晰。最后,您的第二个代码在两个不同方面不等同于此:正如所指出的,你永远不会重置,y所以在第一次内部运行循环运行后它永远不会再次运行此外,由于您x++;在内循环中也是如此,这意味着它始终保持x == y,因此外循环也永远不会在第一次迭代后运行。您的第二个代码实际上与for(int x = 0, y = 0; y <= n && x <= n; x++, y++) {&nbsp; &nbsp; z = x * y;}这段代码显然只需要运行n几次,而不是n*n要快得多。

墨色风雨

在第一个循环中,y总是将值分配给zeroevery iteration,这使得它需要更多的时间和步骤才能达到n,而在第二个循环中,y不会重置为,zero因此它可以更快地达到 n 并且步骤更少。循环1while (x <= n) {&nbsp; &nbsp; &nbsp; &nbsp; int y = 0;循环2&nbsp;while (x <= n) {&nbsp; &nbsp; &nbsp; &nbsp; while (y <= n) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; z = x * y;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y++;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java