亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么一個嵌套的while循環比另一個嵌套的while循環快?

為什么一個嵌套的while循環比另一個嵌套的while循環快?

拉風的咖菲貓 2022-06-04 16:56:31
所以我在課堂上寫了一個嵌套的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”是相同的。
查看完整描述

2 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

我相信這段代碼有很多問題。


首先,不需要z = x * y在循環內部計算,因為每次但最后一次迭代都會覆蓋該值。因此,您的代碼實際上與以下內容相同:


heatTheUniverseForSomeTime();

int z = n*n;

這意味著輸出z相同的事實實際上幾乎沒有說明循環是如何工作的。


其次int是沒有足夠大的類型來保存 的值100000*100000。這就是為什么你有1410065408而不是更多的期望10000000000。long會有所幫助(但請注意,您也應該將至少一個論點long放在右邊?。H绻枰蟮闹?,請考慮BigInteger.


for第三點是,您的第一個示例可以通過使用循環以更常見且因此易于理解的形式重寫,如下所示:


for(int x = 0; x <= n; x++) {

    for(int y = 0; y <= n; y++) {

        z = x * y;

    }

}

這段代碼顯然需要n*n總共運行迭代。


我也相信現在第 1 點變得更加清晰。


最后,您的第二個代碼在兩個不同方面不等同于此:


正如所指出的,你永遠不會重置,y所以在第一次內部運行循環運行后它永遠不會再次運行


此外,由于您x++;在內循環中也是如此,這意味著它始終保持x == y,因此外循環也永遠不會在第一次迭代后運行。


您的第二個代碼實際上與


for(int x = 0, y = 0; y <= n && x <= n; x++, y++) {

    z = x * y;

}

這段代碼顯然只需要運行n幾次,而不是n*n要快得多。


查看完整回答
反對 回復 2022-06-04
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

在第一個循環中,y總是將值分配給zeroevery iteration,這使得它需要更多的時間和步驟才能達到n,而在第二個循環中,y不會重置為,zero因此它可以更快地達到 n 并且步驟更少。


循環1


while (x <= n) {

        int y = 0;

循環2


 while (x <= n) {

        while (y <= n) {

            z = x * y;

            x++;

            y++;    

        }


查看完整回答
反對 回復 2022-06-04
  • 2 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號