您的位置:首页 > 其它

粗心的物理学家 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));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM OJ