我有来自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
答案 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