我正在阅读有关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
?
答案 0 :(得分:4)
第一次,因为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;
}
如果您的编译器的 really 很聪明(例如clang -O2
),则会将其编译为简单的result = 5050;
,但是这样的优化最终可能成为 really < / em>编译速度较慢(除非事先对特定示例进行特殊处理,否则会使编译器占用更多空间,否则必须事先运行代码以计算该值的含义。)
答案 1 :(得分:0)
@ wizzwiss34的答案是正确的……增加了更多上下文。在数学中,这称为finite series,而您正在做的是使用C实现此数学函数。
有限级数是有限项的总和。一个 无限级数具有无限数量的项,且上限为 无穷。本教程将处理有限级数。无限系列 将在微积分教程中介绍。
在这种情况下,顺序为100 + 99 + 98 + 97 ... + 1 = 5050
对于i
总数,您每次都添加i-1
。