为什么变量值在通过两个循环递增后达到5050? (循环到100)

问题描述 投票:2回答:2

我正在读一本关于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

c loops increment
2个回答
4
投票

第一次,内部循环将运行一次,因为i1,将1添加到result。第二次,它将运行两次因为i2,将2添加到result第三次,内部循环将运行三次因为i3,将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;,但是这样的优化最终会导致编译速度变慢(它必须预先运行代码来计算值的含义,除非它特殊情况下的特定示例,使编译器占用更多空间)。


0
投票

@ wizzwiss34的答案是正确的...添加更多的上下文。在数学中,这被称为finite series,你正在做的是用C实现这个数学函数。

有限序列是有限数量项的总和。无限系列具有无限数量的项和无穷大的上限。本教程将介绍有限系列。无限系列将在微积分教程中介绍。

在这种情况下,序列是100 + 99 + 98 + 97 ... + 1 = 5050

对于i的总数,您每次都要添加i-1

© www.soinside.com 2019 - 2024. All rights reserved.