粗心的物理学家 FZU-1058 (水坑题)
2016-08-18 15:55
176 查看
其实这个题,也只是个水坑题,很多人看到的第一感觉就是个水题,编好代码,各种测试数据都过了,就直接提交了,结果就是WA。其实只不过忽略了数据的处理。
这个题首先得从最大的数的倒数开始累加,原因就在于,大数吃小数的问题,也就是精度的问题,因为先加小数的话,加到最后大数会把小数的影响覆盖掉。所以要先加大数,最后加小数的时候才不会被大数影响。明白这个道理,代码就出来了
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
main ()
{
double a;
while ( scanf("%lf",&a)!=EOF)
{
double sum=0.00;
while (a)// 在这不能直接用a--,我第一次做的时候也是用a--,但是结果不对,现在都还不知道原因。
{
sum+=1.000000000000/a;
a--;
}
printf("%.12lf\n",sum);
}
}
其次 大家还可以看看下面这个代码 ,是从小数开始累加的,不过加了一个四舍五入的程序,结果也能AC
#include <stdio.h>
#include <math.h>
main ()
{
int a;
while (scanf("%d",&a)!=EOF)
{
int i;
double b,sum=0,c;
for(i=1;i<=a;i++)
sum+=(1.000000000000/i);
b=sum*pow(10,13.00);
c=fmod(b,10);
if(c>=5)
b+=10;
printf("%.12lf\n",b*pow(10,-13));
}
}
这个题首先得从最大的数的倒数开始累加,原因就在于,大数吃小数的问题,也就是精度的问题,因为先加小数的话,加到最后大数会把小数的影响覆盖掉。所以要先加大数,最后加小数的时候才不会被大数影响。明白这个道理,代码就出来了
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
main ()
{
double a;
while ( scanf("%lf",&a)!=EOF)
{
double sum=0.00;
while (a)// 在这不能直接用a--,我第一次做的时候也是用a--,但是结果不对,现在都还不知道原因。
{
sum+=1.000000000000/a;
a--;
}
printf("%.12lf\n",sum);
}
}
其次 大家还可以看看下面这个代码 ,是从小数开始累加的,不过加了一个四舍五入的程序,结果也能AC
#include <stdio.h>
#include <math.h>
main ()
{
int a;
while (scanf("%d",&a)!=EOF)
{
int i;
double b,sum=0,c;
for(i=1;i<=a;i++)
sum+=(1.000000000000/i);
b=sum*pow(10,13.00);
c=fmod(b,10);
if(c>=5)
b+=10;
printf("%.12lf\n",b*pow(10,-13));
}
}
相关文章推荐
- FZU 1058 粗心的物理学家
- FZU 1058 粗心的物理学家
- Fzu_1058 粗心的物理学家
- FZU1058 之 粗心的物理学家
- 1058 粗心的物理学家
- FZU 粗心的物理学家
- FOJ-1058-粗心的物理学家
- FOJ-1058-粗心的物理学家
- Problem 1058 粗心的物理学家
- 粗心的物理学家
- FZU1058
- FZU 1004 || HOJ 1058 Number Triangles
- fjnu 1156 粗心的物理学家
- 粗心的物理学家
- FZU1492
- 损失来自粗心 巧设置避免WMP11误删文件
- mysql学习笔记(二)之一个粗心的问题
- FZU 1055 赋值问题
- FZU 1402 猪的安家
- fzu1635