UVA 11809 - Floating-Point Numbers


好了,两张贴图扔上来了(第一次试),大概说一下什么意思,浮点数的储存方式(阶码和尾数,尾数是少一个1的,阶码有表示正负的0/1),然后举个栗子姐姐:double是8个字节,我们现在随便malloc,然后尾数和阶码的数量随便定(0,9闭区间和1,30闭区间)我们输入一个最大值,再去判定这个最大值时尾数和阶码是几位(英语菜,小样看了半天才看懂......)然后,我们会发现2的30次方的时候(极限情况,300行输入)根本装不下(这只是10的次方项),所以我们肯定要砍点了,所以我们直接就不运算10的2的30次方的次方,直接log10()扔出来2的a次方,然后再加上一个log10(b)————(前面那个尾数),然后存入二维数组依次的尾数和阶码的那个position,打表完直接暴力搜索。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    //freopen("in.txt","r",stdin);
    double s[11][32];
    memset(s,0,sizeof(s));
    char n[100];
    double a;
    int b,i;
    int c,d;//c是前面的数量,d是后面的
    double e,f;//e记录前面的最大值,f记录后面的次方数
    for(c=0; c<10; c++)
    {
        for(d=1; d<31; d++)
        {
            e=1-pow(2,-1-c);
            f=pow(2,d)-1;//多少次方
            s[c][d]=f*log10(2)+log10(e);
        }
    }
    int flag;
    double x;
    while(1)
    {
        flag=0;
        scanf("%s",n);
        for(i=0;n[i]!='\0';i++)
        if(n[i]=='e'){n[i]=' ';break;}
        sscanf(n,"%lf %d",&a,&b);
        //printf("%lf %d",a,b);
        if(a==0&&b==0)break;
        x=b+log10(a);
        for(c=0; c<10; c++)
        {
            for(d=1; d<31; d++)
            {
                if(fabs(s[c][d]-x) <1e-5)
                {
                    printf("%d %d\n",c,d);
                    flag=1;
                    break;
                }
            }
            if(flag==1)break;
        }
       // printf("yes");
    }
    return 0;
}


总结一下:

1.开始全无思路,翻译完一圈之后小样都没看懂,再看......

2.看懂了,开始设计情况,设计完发现没输出,有了那行cout<<yes;

3.数据跑完小样不对,第二个小样出的7,6,之前开1e-3,qq截图出7,6和8,6的差别,(变成了1e-5)

4.开始打表是c=1......好吧,菜。

综上所述:草稿纸确实是个好东西,(虽然我草稿纸天马行空),但是当时逻辑清晰多了。

(开始还比较飘打算不用pow,后来一想还有负数情况......算了,写个算平方的好麻烦......)

当时感觉pow有误差的嘛,后来想想要是真自己写一个都得用double,学校的题那是比较低端的int类型平方版本,尽量无误差。(误导啊)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值