-5

当我运行这段代码时,我得到一个输出: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;
}
4

4 回答 4

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]

于 2013-09-14T11:03:15.537 回答
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]);

a[N]={1,2,3,4,5,6};

进行跟踪是最简单的方法。#DEFINE 中的 N = 6 因此第一个 for 循环将执行 6 次

第一次运行

当 i = 0 j= 1

一[0] += 一[1]

所以现在 a[0] 等于 3

j++ 所以 j 现在等于 2

我 = 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

等等

于 2013-09-14T10:59:12.020 回答
1

您的程序对数组“a”的元素求和。第一个循环确定起始索引,内部循环对数组的元素求和(考虑起始索引 i)。最后,a[0] 包含所有数组元素的总和,a[1] 包含从索引 1 开始的所有数组元素的总和,依此类推。

于 2013-09-14T10:55:02.373 回答
0

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]);
于 2013-09-14T10:59:30.523 回答