题目如下:
输入两个正整数n<m<10^6,输出1/n^2 + 1/(n+1)^2 + ... +1/m^2 ,保留五位小数,输入包含多组数据,结束标记为 n=m=0
样例输入:
2 4
65536 655360
0 0
样例输出:
Case 1: 0.42361
Case 2: 0.00001
小伙伴们可以先尝试一下哦!
————————————————分割线 题目解析———————————————————
首先这个题目要学会多组数据输入,这里先展示适用于本题目的一种,其它多组数据输入方法别的博客写的很清楚,后续有需要我会整理。
具体后面的数字到底表示什么我不太清楚,但是用途是这么用的。有知道的小伙伴还请赐教!
#include <stdio.h>
int main()
{
int n = 0;
while(scanf("%d",&n) == 1) //这里的1是指有n这一个
{
//输入你要循环的内容
}
return 0;
}
//输入格式:
//2 3
#include <stdio.h>
int main()
{
int m = 0, n = 0
while(scanf("%d %d",&n,&m) == 2) //这里的2是指m,n两个
{
//你要循环的内容
}
return 0;
}
知道多组输入数据,接下来就可以写代码了,以下是细节陷阱!
#include <stdio.h>
int main()
{
int n = 0, m = 0, kase = 0;
double f = 0,sum = 0;
while(scanf("%d %d",&n,&m) == 2)
{
if (n == 0 && m == 0)
{
break;
}
for(int i = n; i <= m; i++)
{
f = 1.0/double(i*i); //如果你觉得这里没问题就大错特错了!
sum = sum + f;
f = 0;
}
printf("Case %d: %.5f\n",++kase,sum);
sum = 0;
}
return 0;
}
你会发现第二组样例输入是错误的,不信可以运行一下!
这是什么原因呢?
原来是平方过后的数字超出范围了,这个时候我们可以思考
如果 1/double(i*i) 不行,但是 1/i 是可以的,不会超过范围
那么改正之后的代码如下:
#include <stdio.h>
int main()
{
int n = 0, m = 0, kase = 0;
double f = 0,sum = 0;
while(scanf("%d %d",&n,&m) == 2)
{
if (n == 0 && m == 0)
{
break;
}
for(int i = n; i <= m; i++)
{
f = 1.0/i;
f = f/i; //也可以写成 f /= i;
sum = sum + f;
f = 0;
}
printf("Case %d: %.5f\n",++kase,sum);
sum = 0;
}
return 0;
}
这个时候我们就解决这道题目啦
还有一些小细节大家要注意初始化变量,不要带的第一轮的值去运行第二轮,那样结果会一样
还有一个也是小细节!!!
如果把 if 条件放到后面,你运行起来是没有问题的,但是!!!
怎么可以去除以一个0呢,所以是有问题的,只是它并非会报错,而是提醒,但是不影响运行,所以直接输入0 0也是没有影响的,所以大家一定要把 if 判断放在前面!
#include <stdio.h>
int main()
{
int n = 0, m = 0, kase = 0;
double f = 0,sum = 0;
while(scanf("%d %d",&n,&m) == 2)
{
for(int i = n; i <= m; i++)
{
f = 1.0/double(i*i);
sum = sum + f;
f = 0;
}
if (n == 0 && m == 0)
{
break;
}
printf("Case %d: %.5f\n",++kase,sum);
sum = 0;
}
return 0;
}
今天你看完这道题也在进步呢,依旧以一句话结束今天
“我走的很慢,但我绝不停留”,一旦停下来,你又会歇多久呢?