このコードを実行すると、出力が得られます: 21 20 18 15 11 6
、この出力を取得する方法を教えてください。
#define N 6
int main(void)
{
int i,j,a[N]={1,2,3,4,5,6};
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
a[i]+=a[j];
for(i=0;i<N;i++)
printf("%d",a[i]);
return 0;
}
このコードを実行すると、出力が得られます: 21 20 18 15 11 6
、この出力を取得する方法を教えてください。
#define N 6
int main(void)
{
int i,j,a[N]={1,2,3,4,5,6};
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
a[i]+=a[j];
for(i=0;i<N;i++)
printf("%d",a[i]);
return 0;
}
2 番目の for ループ内のすべての結果を見ると、理解しやすいかもしれません。
[1、2、3、4、5、6]
[3, 2, 3, 4, 5, 6]
[6、2、3、4、5、6]
[10、2、3、4、5、6]
[15、2、3、4、5、6]
[21, 2, 3, 4, 5, 6] 今私は増加します
[21、5、3、4、5、6]
[21、9、3、4、5、6]
[21、14、3、4、5、6]
[21, 20, 3, 4, 5, 6] 今私は増加します
[21、20、7、4、5、6]
[21、20、12、4、5、6]
[21, 20, 18, 4, 5, 6] 今私は増加します
[21、20、18、9、5、6]
[21, 20, 18, 15, 5, 6] 今私は増加します
[21、20、18、15、11、6]
あなたのプログラムは、配列 'a' の要素を合計します。最初のループは開始インデックスを決定し、内側のループは配列の要素を合計します (開始インデックス i を考慮して)。最後に、a[0] にはすべての配列要素の合計が含まれ、a[1] にはインデックス 1 から始まるすべての配列要素の合計が含まれます。
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
a[i]+=a[j];
for(i=0;i<N;i++)
printf("%d",a[i]);
[N] = {1,2,3,4,5,6};
トレースを行うのが最も簡単な方法です。#DEFINE からの N = 6 なので、最初の for ループは 6 回実行されます。
最初の実行のために
i = 0 j = 1のとき
[0] += [1]
したがって、a[0] は 3 に等しくなります
j++ なので j は 2 に等しい
i = 0 j = 2
[0] += [2]
a[0] (3) に a[2] (3) を足すと、6 になります。
j++ なので j は 2 に等しい
トレースを続けると、1+2+3+4+5+6 = 21 である配列の残りを合計していることがわかります。
次の反復は 2+3+4+5+6 です
等
後
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
a[i]+=a[j];
の値
a[0] = 1+2+3+4+5+6 = 21
a[1] = 2+3+4+5+6 = 20
a[2] = 3+4+5+6 = 18
a[3] = 4+5+6 = 15
a[4] = 5+6 = 11
a[5] = 6 = 6
と
printf("%d",a[i]);
する必要があります
printf("%d\n",a[i]);