输入两个整数n<m<10^6,输出1/n^2+1/(n+1)^2......1/m^2,保留5位小数。输入包含多组数据,结束标记为n=m=0。
初始版本
#include <stdio.h>
int main(int argc, char *argv[]) {
int i,m,n,kase = 0;
double a,sum = 0;
while(1)
{
scanf("%d%d",&n,&m);
if(m||n)
{
for(i = n;i<=m;i++)
{
a = 1.0/(i*i);
sum = sum+a;
}
++kase;
printf("Caes%d:%.5lf",kase,sum);
}
else
break;
}
return 0;
}
int main(int argc, char *argv[]) {
int i,m,n,kase = 0;
double a,sum = 0;
while(1)
{
scanf("%d%d",&n,&m);
if(m||n)
{
for(i = n;i<=m;i++)
{
a = 1.0/(i*i);
sum = sum+a;
}
++kase;
printf("Caes%d:%.5lf",kase,sum);
}
else
break;
}
return 0;
}
存在问题:1.sum赋值放在循环外,再次输入时未清零
2.溢出
解决方法:1.sum赋值放到while循环中
2.将i定义为long long类型
1.0
#include <stdio.h>
int main(int argc, char *argv[]) {
int m,n,kase = 0;
double a,sum;
long long i;
while(1)
{
scanf("%d%d",&n,&m);
sum = 0;
if(m||n)
{
for(i = n;i<=m;i++)
{
a = 1.0/(i*i);
sum = sum+a;
}
++kase;
printf("Caes%d:%.5lf",kase,sum);
}
else
break;
}
return 0;
}
int main(int argc, char *argv[]) {
int m,n,kase = 0;
double a,sum;
long long i;
while(1)
{
scanf("%d%d",&n,&m);
sum = 0;
if(m||n)
{
for(i = n;i<=m;i++)
{
a = 1.0/(i*i);
sum = sum+a;
}
++kase;
printf("Caes%d:%.5lf",kase,sum);
}
else
break;
}
return 0;
}
运行正常,但不够简洁
2.0
#include <stdio.h>
int main(int argc, char *argv[]) {
int m,n,kase = 0;
double a,sum;
long long i;
while(scanf("%d%d",&n,&m)&&n&&m)
{
sum = 0;
for(i = n;i<=m;i++)
{
a = 1.0/(i*i);
sum = sum+a;
}
++kase;
printf("Caes%d:%.5lf",kase,sum);
}
return 0;
}
int main(int argc, char *argv[]) {
int m,n,kase = 0;
double a,sum;
long long i;
while(scanf("%d%d",&n,&m)&&n&&m)
{
sum = 0;
for(i = n;i<=m;i++)
{
a = 1.0/(i*i);
sum = sum+a;
}
++kase;
printf("Caes%d:%.5lf",kase,sum);
}
return 0;
}