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

时间:2019-04-07 15:04:17

标签: c loops increment

我正在阅读有关C编程的初学者书籍,其中包含一些练习。 这是其中之一,问题询问以下循环将导致什么结果……

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape android:shape="rectangle">
            <stroke
                    android:dashGap="5dp"
                    android:dashWidth="8dp"
                    android:width="8dp"
                    android:color="#989898"/>
            <corners android:radius="10dp"/>
        </shape>
    </item>

    <item>
        <rotate
                android:fromDegrees="60"
                android:toDegrees="45"
                android:pivotX="50%"
                android:pivotY="50%">

            <shape
                    android:shape="line">
                <stroke
                        android:dashGap="5dp"
                        android:dashWidth="8dp"
                        android:width="8dp"
                        android:color="#989898"/>
            </shape>
        </rotate>
    </item>


</layer-list>

我的“理性”答案应该是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

2 个答案:

答案 0 :(得分: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;
}

如果您的编译器的 really 很聪明(例如clang -O2),则会将其编译为简单的result = 5050;,但是这样的优化最终可能成为 really < / em>编译速度较慢(除非事先对特定示例进行特殊处理,否则会使编译器占用更多空间,否则必须事先运行代码以计算该值的含义。)

答案 1 :(得分:0)

@ wizzwiss34的答案是正确的……增加了更多上下文。在数学中,这称为finite series,而您正在做的是使用C实现此数学函数。

  

有限级数是有限项的总和。一个   无限级数具有无限数量的项,且上限为   无穷。本教程将处理有限级数。无限系列   将在微积分教程中介绍。

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

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