1
PrintStream out = System.out;

    int sum = 0;
    for(int i = 0; i<5; i++)
        for(int j=i; j<5; j++)
            sum++;
    out.println(sum);

出力: 15. これが 15 になる方法がわからない. 頭の中で解こうとしたが、25 になり続けた.

2 番目の for ループを無視して、最初の for ループに sum++ を入れると、5 になります。

PrintStream out = System.out;

    int sum = 0;
    for(int i = 0; i<5; i++)
        for(int j=i; j<5; j++);
            sum++;
    out.println(sum);

出力: 1. ; を入力するとどうなりますか? for ステートメントの後。止まりますか?

4

4 に答える 4

6
i = 0 => j goes from 0 to 4 => sum = 5  
i = 1 => j goes from 1 to 4 => sum = 5 + 4 = 9  
i = 2 => j goes from 2 to 4 => sum = 9 + 3 = 12  
i = 3 => j goes from 3 to 4 => sum = 12 + 2 = 14  
i = 4 => j goes from 4 to 4 => sum = 14 + 1 = 15 

2 番目のコード スニペットはそのままではコンパイルされません。

編集

2 番目のスニペットがコンパイルされると、次のようになります。

for(int i = 0; i<5; i++)
    for(int j=i; j<5; j++);
        sum++;

は次と同等です (これが、常に中括弧を使用する必要がある理由です):

for(int i = 0; i<5; i++) {
    for(int j=i; j<5; j++) {
    }
}
sum++;

それがなぜ1を出力するのかを説明しています。

于 2012-08-15T23:28:16.590 に答える
0

ループは基本的に三角数、具体的には 5 番目の三角数、たとえば形式の数を作成しn + (n - 1) + ... + 2 + 1ます。

トリックと、結果として25が表示されない理由は、2 番目のループにあります。現在の値からまで繰り返すだけです。i5

内側のループが繰り返されるたびに、合計が 1 ずつインクリメントされます。ループ トリックにより、内側のループは 5 回、次に 4 回、というように繰り返されます。

first iteration of the outer loop: j = 0 to 4 -> 5 increments
second iteration of the outer loop: j = 1 to 4 -> 4 increments  
... 3 increments
... 2 increments
... 1 increment

5 + 4 + 3 + 2 + 1 = 15

于 2012-08-15T23:27:29.490 に答える
0

最初のループの各反復でjの値に初期化されるため、出力は 15 です。i

j代わりにゼロに初期化された場合、出力は 25 になります。

于 2012-08-15T23:27:56.970 に答える
0

代わりに 25 を取得するには

    for(int j=i j<5; j++); // inner loop
        sum++;

使用する

//......here
for(int j=0 j<5; j++); // inner loop
        sum++;

あなたが今していることは (1+1+1+1+1) + (1+1+1+1) + (1+1+1) + (1+1) + (1)、あなたが望んでいることです(1+1+1+1+1).. 5 times

ps なぜ 2 番目のコードのループはfor(int j=il j<5; j++); ? は定義されておらず、以前にどこかで定義していたとしても、ilで止まります。;il

于 2012-08-15T23:31:41.713 に答える