我正在读一本关于C编程的初学者书,它有一些练习。这是其中之一,问题是以下循环的结果是什么...
int main()
{
int result = 0;
for (int i = 1; i <= 100; i++)
{
for (int j = 1; j <= i; j++)
{
result++;
}
}
printf("%d", result);
return 0;
}
我的'理性'答案应该是1000
,但为什么正确答案5050
?
第一次,内部循环将运行一次,因为i
是1
,将1
添加到result
。第二次,它将运行两次因为i
是2
,将2
添加到result
第三次,内部循环将运行三次因为i
是3
,将3
添加到result
。等等,直到100
。
最终,这将1 + 2 + 3 + 4 + … + 97 + 98 + 99 + 100
添加到result
。这个值是5050
:第100个三角形数字。
如果您的编译器是智能的(例如gcc -O2
),那么它将了解最内层循环只是一个增量,并编译:
for (int i = 1; i <= 100; i++)
{
for (int j = 1; j <= i; j++)
{
result++;
}
}
至:
for (int i = 1; i <= 100; i++)
{
result += j;
}
如果您的编译器非常智能(例如clang -O2
),它会将其编译为简单的result = 5050;
,但是这样的优化最终会导致编译速度变慢(它必须预先运行代码来计算值的含义,除非它特殊情况下的特定示例,使编译器占用更多空间)。
@ wizzwiss34的答案是正确的...添加更多的上下文。在数学中,这被称为finite series,你正在做的是用C实现这个数学函数。
有限序列是有限数量项的总和。无限系列具有无限数量的项和无穷大的上限。本教程将介绍有限系列。无限系列将在微积分教程中介绍。
在这种情况下,序列是100 + 99 + 98 + 97 ... + 1 = 5050
对于i
的总数,您每次都要添加i-1
。