发布网友 发布时间:2024-10-29 16:30
共1个回答
热心网友 时间:2024-10-29 16:30
求 1+2+...+n ,用公式 f1 = sum(n) = 1+2+..+n 和 f2=sum(n)=n*(n+1)/2 ,
两个公式在【数学上】看时没有任何区别的,因为在数学上,数字可以是【无穷大】的。
但是在【程序设计语言】里面,是有区别的,我们知道整形 int 存储的数字是【有范围】的。
我们假设 1+2+...+n 的最终结果为 R,那么用公式 f1 运算时,【中间结果】有:
1,
1+2,
1+2+3,
....
1+2+...+n
【中间结果】不会超过最终结果 R 的。
但是用公式 f2 是,【中间结果】有:
n
(n+1)
n*(n+1)
...
【中间结果】n*(n+1) 很容易就超出了【最终结果 R】 的。
题目里面限定了【最终结果 R】是不超过 int 类型的范围的,
这样用公式 f1 的话,【所有中间结果】都不会超过【最终结果 R】,也就不会超过 int 类型的范围;
这样用公式 f2的话,有些【中间结果】会超过【最终结果 R】,也就【可能会】超过 int 类型的范围。中间结果超出了 int 范围,最终的结果也就是错误的了。
修改方案1:用更大的整形(_int),使得中间结果不会超出范围:
#include<stdio.h>
int main()
{
__int n;
while(scanf("%Id",&n)!=EOF)
printf("%Id\n\n",n*(n+1)/2);
}
修改方案2:修改中间结果,使得中间结果不会超出范围:
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
// 根据 n 的奇偶性,把除以 2 的操作提前
printf("%d\n\n",(n%2==0)?(n/2*(n+1)):((n+1)/2*n));
}
}