UVA11809 - Floating-Point Numbers

做个结构体,M存位数 和 E存阶码

然后 匹配数据即可

#include <cstdio>
#include <cmath>
#include <cstring>

typedef long long ll;
const double min_differ=1e-5;

struct{
    double M; //存储对应尾数
    ll E;     //存储对应指数
}po[11][33];


void solve(double m,ll e){
    for(int i=0;i<=9;i++)
        for(int j=1;j<=30;j++)
            if(e==po[i][j].E&&fabs(m-po[i][j].M)<min_differ){
                printf("%d %d\n",i,j);
                return;
            }
}

int main(){
    int i,j;
    double m,t;
    ll e;
    char str[22];
    for(i=0;i<=9;i++)
        for(j=1;j<=30;j++){
            e=(1<<j)-1;       //1 11 111 1111   ->  1*(10)
            m=1-1.0/(1<<(i+1));
            t=log10(m)+e*log10(2);
            po[i][j].E=t/1;
            po[i][j].M=pow(10,t-po[i][j].E);
        }
    while(scanf("%s",str),strcmp(str,"0e0")){
        *(strchr(str,'e'))=' ';
        sscanf(str,"%lf %lld",&m,&e);
        solve(m,e);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值