问题描述
- 循环写法为什么输出值不同,求自然数立方和大于1000000时的值
-
1.main()
{
int i, sum = 0;
for (i = 1; sum < 1000000; i++)
{
sum = sum + i*i*i;
}
printf("%d",i);
system("pause");
}
输出462.main()
{
int i, sum = 0;
for (i = 1; ; i++)
{
sum = sum + i*i*i;
if (sum > 1000000)
{
break;
}
}
printf("%d",i);
system("pause");
}
输出453.main()
{
int i;
int sum = 0;
bool b = false;
for (i = 0; !b; i++)
{
sum = sum + i*i*i;
b = sum > 1000000;
}
printf("当i为 %d 时,其立方和大于1000000", i);
system("pause");
}
输出46
4.main()
{
int i;
int sum = 0;
bool b = false;
for (i = 0; !b; i++)
{
b = sum > 1000000;
sum = sum + i*i*i;} printf("当i为 %d 时,其立方和大于1000000", i); system("pause");
}
输出475.书上给的源码是这个,不明白为什么i--
main()
{
int i, sum = 0;
for (i = 1; ; i++)
{
sum = sum + i*i*i;
if (sum > 1000000)
{
break;
}
}
i--;printf("%d",i);
system("pause");
}
解决方案
这个问题就是for(初始化;条件;调整)语句的执行顺序,第一次顺序:初始化->条件->语句;第二次顺序:调整->条件->语句;第三步顺序:调整->
条件->语句......最后一步也是一样。
1中最后一步从上一步得到i=44,i++,sum1000000,但是接下来的是调整,i++,所以i=46;
第2个就显而易见了,i=44时sum<1000000所以不会跳出,输出i=45
第3个和第1个一样
第4个明显i=44时,b=0;再循环一圈i=45时,b=0;在循环一圈i=46时,b=1继续执行下面的语句,然后进行调整i++得到47在进行!b判断。
解决方案二:
减去1 ,是因为最后一次的计算结果 大于 1000000 时已经不满足题目的要求,要减去它。
解决方案三:
这里主要看“退出条件”
如果第一个i, sum + i * i * i >= 1000 , 这个i到底算不算
解决方案四:
sum + i * i * i >= 1000 , 应该是这样。
解决方案五:
1.main()
{
int i, sum = 0;
for (i = 1; sum < 1000000; i++)
{
sum = sum + i*i*i;
}
先i++,然后判断sum < 1000000是否为true,这样即使 sum == 1000000 , 会i++,然后sum == 1000000 为true退出,这样显然i多加了
其他类似分析,不同的是break之后直接跳出循环,不执行i++
最后一个显然错了
最后一个输出44,而实际上是45
n个数的立方和公式n^2 * (n+1)^2 / 4