PAT Advanced Level 2011 注意浮点数精度问题

来源:互联网 发布:广东省网络干部学院 编辑:程序博客网 时间:2024/06/11 10:30

链接:http://www.patest.cn/contests/pat-a-practise/1011

    

输入:

W1 T1 L1

W2 T2 L2

W3 T3 L3

输出:

[min(W1,T1,L1)*min(W2,T2,L2)*min(W2,T2,L2)*0.65-1]*2


【分析】这个题目是4个题目中的第一题,难点应该是浮点数的精度问题

#include<cstdio>#include<iostream>#define INF 1e-10using namespace std;double _max(double a,double b,double c){    double aa=max(a,b);    aa=max(aa,c);    return aa;}int main(){//    freopen("in.txt","r",stdin);    double a,b,c,tot=1;    for(int i=0; i<3; i++)    {        if(i)            printf(" ");        scanf("%lf%lf%lf",&a,&b,&c);        double aa=_max(a,b,c);        tot*=aa;        if(aa-a<INF&&aa-a>-INF)            printf("W");        if(aa-b>-INF&&aa-b<INF)            printf("T");        if(aa-c>-INF&&aa-c<INF)            printf("L");    }    tot=(tot*0.65-1)*2;    printf(" %.2lf\n",tot+0.0005);    return 0;}


这种方法由于中间步骤比较多,导致误差较大,最后tot+0.0005来弥补精度损失,另外如果是tot+0.005就会WA,1.3+0.005就会保留两位小数就会变成1.31,有了误差。


#include<cstdio>#include<iostream>#define INF 1e-10using namespace std;int main(){//    freopen("in.txt","r",stdin);    double a,b,c,tot=1;    double x[3];    for(int i=0; i<3; i++)    {        scanf("%lf%lf%lf",&a,&b,&c);        if(a>b&&a>c)        {            x[i]=a;            printf("W ");        }        else if(b>a&&b>c)        {            x[i]=b;            printf("T ");        }        else        {            x[i]=c;            printf("L ");        }    }    tot=(x[0]*x[1]*x[2]*0.65-1)*2;    printf("%.2lf\n",tot);    return 0;}

 

这种方法中间步骤较少,误差小,也可以AC


0 0