鱼C论坛

 找回密码
 立即注册
查看: 1124|回复: 4

[已解决]C语言for循环

[复制链接]
发表于 2023-6-8 08:54:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
编写程序,求1-3+5-7+...-99+101的值
我编写了两个程序,为什么结果不同呢,哪个应该正确?
程序1:结果为-51
#include <stdio.h>
int main(void)
{
int i,n,sum=0,sign=1;
for(i=1,n=1;i<=101;i=i+2)
{
sum=sum+n;
sign=-sign;
n=n+2;
n=sign*n;
}
printf("%d\n",sum);
return 0;
}

程序2:结果为51
#include <stdio.h>
int main(void)
{
int i,n,sum=0,sum1=0;
for(i=1;i<=101;i=i+4)
sum=sum+i;
for(i=3;i<=101;i=i+4)
sum1=sum1+i;
n=sum-sum1;
printf("%d\n",n);
return 0;
}
最佳答案
2023-6-8 09:38:31
这两个程序分别表示了两种不同的方法来计算序列1-3+5-7+...-99+101的值,但它们存在编程逻辑上的不同。

首先,让我们分析第一个程序:
#include <stdio.h>
int main(void)
{
int i,n,sum=0,sign=1;
for(i=1,n=1;i<=101;i=i+2)
{
sum=sum+n;
sign=-sign;
n=n+2;
n=sign*n;
}
printf("%d\n",sum);
return 0;
}

这个程序试图交替地添加和减去奇数,但是它的执行顺序有些问题。在每个循环迭代中,首先把n加到sum上,然后改变sign的值,接着增加n的值,最后乘以sign。但是这个顺序意味着sign的改变会在n增加之后发生,所以实际上你是在把下一个奇数乘以当前的符号,而不是像你想的那样,把当前的奇数乘以当前的符号。这就是为什么第一个程序得到的结果是错误的。

第二个程序如下:
#include <stdio.h>
int main(void)
{
int i,n,sum=0,sum1=0;
for(i=1;i<=101;i=i+4)
sum=sum+i;
for(i=3;i<=101;i=i+4)
sum1=sum1+i;
n=sum-sum1;
printf("%d\n",n);
return 0;
}

这个程序首先计算所有需要加的数(1, 5, 9, ... 101),然后计算所有需要减的数(3, 7, 11, ... 99),然后做减法。这个方法准确地执行了题目要求的操作,所以得到的答案是正确的,序列1-3+5-7+...-99+101的结果应该是51。

因此,第二个程序是正确的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-8 09:38:31 | 显示全部楼层    本楼为最佳答案   
这两个程序分别表示了两种不同的方法来计算序列1-3+5-7+...-99+101的值,但它们存在编程逻辑上的不同。

首先,让我们分析第一个程序:
#include <stdio.h>
int main(void)
{
int i,n,sum=0,sign=1;
for(i=1,n=1;i<=101;i=i+2)
{
sum=sum+n;
sign=-sign;
n=n+2;
n=sign*n;
}
printf("%d\n",sum);
return 0;
}

这个程序试图交替地添加和减去奇数,但是它的执行顺序有些问题。在每个循环迭代中,首先把n加到sum上,然后改变sign的值,接着增加n的值,最后乘以sign。但是这个顺序意味着sign的改变会在n增加之后发生,所以实际上你是在把下一个奇数乘以当前的符号,而不是像你想的那样,把当前的奇数乘以当前的符号。这就是为什么第一个程序得到的结果是错误的。

第二个程序如下:
#include <stdio.h>
int main(void)
{
int i,n,sum=0,sum1=0;
for(i=1;i<=101;i=i+4)
sum=sum+i;
for(i=3;i<=101;i=i+4)
sum1=sum1+i;
n=sum-sum1;
printf("%d\n",n);
return 0;
}

这个程序首先计算所有需要加的数(1, 5, 9, ... 101),然后计算所有需要减的数(3, 7, 11, ... 99),然后做减法。这个方法准确地执行了题目要求的操作,所以得到的答案是正确的,序列1-3+5-7+...-99+101的结果应该是51。

因此,第二个程序是正确的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-8 10:29:49 | 显示全部楼层
isdkz 发表于 2023-6-8 09:38
这两个程序分别表示了两种不同的方法来计算序列1-3+5-7+...-99+101的值,但它们存在编程逻辑上的不同。

...

明白了,就是用n=sign*n这个时候是有问题的,直接就让n的值改变了,当第一个循环发生后n=-3,在下一个循环中n=n+2=-3+2=-1了,这就不是想要的5,加起来就会出错
改变如下就可以解决,*引入一个当前项term,循环过程中就不会改变n的值符号
#include <stdio.h>
int main(void)
{
int i,n,term=1,sum=0,sign=1;
for(i=1,n=1;i<=101;i=i+2)
{
sum=sum+term;/*引入一个当前项term*/
sign=-sign;
n=n+2;
term=sign*n;/*引入一个当前项term,循环过程中就不会改变n的值,否则n的值为负数,然后下一个循环+2后就不是想要的值了如-3+2=-1,并不是想要的5*/
}
printf("%d\n",sum);
return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-8 10:31:30 | 显示全部楼层
zeroto-alittel 发表于 2023-6-8 10:29
明白了,就是用n=sign*n这个时候是有问题的,直接就让n的值改变了,当第一个循环发生后n=-3,在下一个循环 ...

是的,你完全理解对了。你提供的这段代码就完全符合你原本的意图了,确实解决了你的问题。

现在的代码正确定义了符号交替的奇数数列,用变量 term 保存当前的项(包含符号),这个项被加到了 sum 中。每次迭代,首先把 term 加到 sum 上,然后改变 sign 的值,接着增加 n 的值,最后根据 sign 和 n 更新 term 。这样,我们就确保了在每个循环迭代中,我们添加的项都是正确的。

这是你修改后的代码:
#include <stdio.h>
int main(void)
{
int i,n,term=1,sum=0,sign=1;
for(i=1,n=1;i<=101;i=i+2)
{
sum=sum+term;
sign=-sign;
n=n+2;
term=sign*n;
}
printf("%d\n",sum);
return 0;
}

很好,这个程序能够正确地计算给定序列的结果,你的理解完全正确。这是一个很好的例子,说明了在编程中理解变量值如何在循环中改变的重要性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-8 10:33:06 | 显示全部楼层
isdkz 发表于 2023-6-8 10:31
是的,你完全理解对了。你提供的这段代码就完全符合你原本的意图了,确实解决了你的问题。

现在的代码 ...

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 05:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表