zeroto-alittel 发表于 2023-6-8 08:54:42

C语言for循环

编写程序,求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;
}

isdkz 发表于 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。

因此,第二个程序是正确的。

zeroto-alittel 发表于 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;
}

isdkz 发表于 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;
}


很好,这个程序能够正确地计算给定序列的结果,你的理解完全正确。这是一个很好的例子,说明了在编程中理解变量值如何在循环中改变的重要性。

zeroto-alittel 发表于 2023-6-8 10:33:06

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

现在的代码 ...

谢谢!
页: [1]
查看完整版本: C语言for循环