子序列的和 溢出问题
尽管学了C的基础,也不能忽视不理紫书的语言板块。果然还是出了问题。
题目如下:输入两个正整数 n<m<,输出 ,保留5位小数。输出包含多组数据,结束标记为 n=m=0。
开始的代码如下,不过多亏了这个测试数据输入n=65536,m=655360
看到10^6自然想到了比int大点的,就long吧。
#include<stdio.h>
int g = 1;
int main()
{
long a, b;
int i;
while(scanf("%ld %ld", &a, &b) != EOF){
if(a == 0 && b == 0)
break;
double sum = 0.0;
for(i = a; i <= b; i++)
sum = sum + (1.0 / (i*i));
printf("Case %d: %.5lf\n", g++, sum);
}
return 0;
}
输入之后,得到的是1.#INF0,一直以为除数不能为0故如果发生此种情况,会输出1.#INF0,现在发现这个代表的是无穷大,也就是告诉你,它溢出了,故有两种解决办法。
1.将1/(i*i)→1/i/i避免i与i相乘溢出
2.long→long long
个人还是倾向于long吧,时间对于目前追求精简的我还是更为重要的(hhh