UVa 11809 Floating Point Numbers

浮点数

都是眼泪有木有

刚开始题就没看懂

百度补了一下浮点数的储存

想起紫书里一个例子

for(double i=0.0;i!=10;i+=0.1)
	printf("%llf\n",i);
不要目测答案,一定要编译测试一下

(扯远了

-------------------回归分割线(回归线)----------------

这题思路还是挺清晰的

浮点数分两个部分 那就分别计算两个部分

后面的指数部分嘛

2^ (1,3,7,15....)

每一项都等于前一项的平方*2

然后注意科学计数法的 前面那个数是大于等于1小于10的

每次计算后要调整一下

浮点数的前一部分直接用函数就算出来了

遍历所有的m和e 

我这里是 befo 和 bee (迷の变量名

查找e相等而且m相差最小的那个解

说到输入,我本来都想手写一个字符串转化为浮点数的while了

还好晓楠告诉我可以用sscanf

用法如代码

-----------------------------------以下是控诉反思------------------

这题调了2天,WA六次

刚开始卡题目半天百度浮点数的表示方法勉强理解题意

二进制表示小数表示没看懂,不过知道怎么算了

样例的两组数据能逆向求出来

然后写遍历比较的部分

这也是悲剧的开始。。。。

比较的时候没有注意格式

科学计数法的前面那个数没有处理好

要重新调整一下的我没有去调,而且刚开始写的时候

指数部分的调整也没弄好

当时是凑合能用,但是感觉有点不对

一但改动一下就是死循环,于是就没改

于是也就WA了六次

最后重新写了一遍,终于AC

介个吧,思路清晰而且刚开始写的很乱的时候不妨重写一遍

晓楠说这个可以直接用位运算 表示不会

位运算还是感觉略高大上

还有看到有取对数做的

同表示不会


#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

double f(int n){
    double ret=0;
    n++;
    double coul=1;
    while(n--){
        coul/=2;
        ret+=coul;
    }
    return ret;
}

int e[31];
double arr[31];

int main(){
    e[0]=0;
    arr[0]=2;
    for(int i=1;i<30;i++){
        e[i]=e[i-1]*2;
        arr[i]=arr[i-1]*arr[i-1]*2;
        while(arr[i]!=0 && (arr[i]<1.0 || arr[i]>10.0)){
            if(arr[i]<1.0){
                arr[i]*=10;
                e[i]--;
            }
            if(arr[i]>10){
                arr[i]=arr[i]/10;
                e[i]++;
            }
        }
    }
    double M;
    int E;
    char get[40];
    while(~scanf("%s",get)){
        char *p=strchr(get,'e');
        *p=' ';
        sscanf(get,"%lf %d",&M,&E);
        if(M==0&&E==0) break;
        int m=0,n=1;
        double miss=10;
        double befo;
        int bee;
        for(int i=0;i<10;i++){
            for(int j=1;j<31;j++){
                befo=f(i)*arr[j-1];
                bee=e[j-1];
                while(befo!=0 && (befo<1.0 || befo>10.0)){
                    if(befo<1.0){
                        befo*=10;
                        bee--;
                    }
                    else{
                        befo=befo/10;
                        bee++;
                    }
                }
                if(fabs(befo-M)<miss && bee==E){
                    miss=fabs(befo-M);
                    m=i,n=j;
                }
            }
        }
        printf("%d %d\n",m,n);
    }
    return 0;
}

以上。。。集训前第一套题勉强AK

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值