标题
输出两个正整数n<m<106。输出1/n2 + 1/(n+1)2+…+1/m2,保留五位小数。结束标记为n=m=0。
#include<stdio.h>
#include<math.h>
int main()
{
int n, m, i;
double sum = 0;
while (scanf_s("%d%d", &n, &m))
{
if (m == 0 && n == 0)break;
for (i = n; i <= m; i++)
sum += 1.0 / (i*i);
printf("%.5f", sum);
}
return 0;
}
此处sum+=1.0/(ii),在输入为65536 655360时会出现乘法结果的溢出,因为先计算的ii的结果超过了int可以容纳的最大值。
因此此处第一种处理方法是改为:1.0/ i / i分成两步除法避免出现乘法造成结果的溢出。
#include<stdio.h>
#include<math.h>
int main()
{
int n, m, i;
double sum = 0;
while (scanf_s("%d%d", &n, &m))
{
if (m == 0 && n == 0)break;
for (i = n; i <= m; i++)
sum += 1.0 / i / i;
printf("%.5f", sum);
}
return 0;
}
第二种处理方法是利用long long型可以容纳更大的数。直接避免结果过大导致的溢出。
#include<stdio.h>
#include<math.h>
int main()
{
int n, m;
double sum = 0;
while (scanf_s("%d%d", &n, &m))
{
long long i;
if (m == 0 && n == 0)break;
for (i = n; i <= m; i++)
sum += 1.0 / (i*i);
printf("%.5f", sum);
}
return 0;
}