For Arrays for Arrays - 从之前的值添加

时间:2014-06-08 20:28:12

标签: c arrays loops for-loop numbers

我有来自Koshar的c编程的以下代码。我确实理解它是如何工作的,我只是不知道for循环中的哪个位置会抓住之前的值。为了组织目的,我将其粘贴在代码下的预期结果。

#include <stdio.h>

int main(void) {
int number [10] = {1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    int i, j;

    for( j = 0; j < 10; ++j)
        for (i = 0; i < j; ++i)
            number[j] += number[i];

    for (j = 0; j < 10; ++j)
        printf ("%i ", number [j]);

        printf("\n");

        return 0;
}

输出

  

1 1 2 4 8 16 32 64 128 256

3 个答案:

答案 0 :(得分:1)

要了解发生了什么,您应该在外部number循环的每次迭代(即for上的循环)之后打印数组j的状态。数组的外观如下:

Before:       1 0 0 0 0 0 0 0 0 0 
After 1 run:  1 1 0 0 0 0 0 0 0 0 
After 2 runs: 1 1 2 0 0 0 0 0 0 0 
After 3 runs: 1 1 2 4 0 0 0 0 0 0 
After 4 runs: 1 1 2 4 8 0 0 0 0 0 
After 5 runs: 1 1 2 4 8 16 0 0 0 0 
After 6 runs: 1 1 2 4 8 16 32 0 0 0 
After 7 runs: 1 1 2 4 8 16 32 64 0 0 
After 8 runs: 1 1 2 4 8 16 32 64 128 0 
After 9 runs: 1 1 2 4 8 16 32 64 128 256

内部for循环(在i上)将目前收集的所有先前数字添加到位置j中的数字中,因此numbers[1]具有项目0的总和。 .0,numbers[2]的项目总和为0..1,numbers[3]为0..2,依此类推。您可以看到每次迭代如何用适当的数字总和替换下一个零。

答案 1 :(得分:0)

你说:

  

我确实理解它是如何工作的,我只是不知道for循环中的哪个位置会抓住以前的值。

这段代码:

    for (i = 0; i < j; ++i)
        number[j] += number[i];

将元素的所有值的总和放在索引为n

的元素中的索引n+1之前

碰巧发生了

1 + 1 = 2 => Twice the last value.
1 + 1 + 2 = 4 => Twice the last value.
1 + 1 + 2 +  ... + n = 2*n => Twice the last value.

答案 2 :(得分:-2)

for(j = 0; j&lt; 10; ++ j)这是你的外循环 for(i = 0; i&lt; j; ++ i)这是你的内循环

步骤1.你的外循环运行一次,内循环运行j次。(因为j = 0所以不要运行)。和数字[0] = 1
 步骤2.你的外循环运行一次,内循环运行j次。(因为j = 1所以不要运行)。和数字[1] = 1
 步骤3.你的外循环运行一次,内循环运行j次。(因为j = 2所以不要运行)。和数字[2] = 2
 步骤4.你的外循环运行一次,内循环运行j次。(因为j = 3所以不运行)。和数字[3] = 4
 步骤5.你的外循环运行一次,内循环运行j次。(因为j = 4所以不要运行)。和数字[4] = 8
 步骤6.你的外循环运行一次,内循环运行j次。(因为j = 5所以不要运行)。和数字[5] = 16
 步骤7.你的外循环运行一次,内循环运行j次。(因为j = 6所以不要运行)。和数字[6] = 32
 步骤8.你的外循环运行一次,内循环运行j次。(因为j = 7所以不要运行)。和数字[7] = 64
 步骤8.你的外循环运行一次,内循环运行j次。(因为j = 8所以不要运行)。和数字[8] = 128
 步骤10.你的外循环运行一次,内循环运行j次。(因为j = 9所以不要运行)。和数字[9] = 256