浮点数(UVa11809)题解

如题


计算机常用阶码-尾数的形式保存浮点数。如下所示,若阶码有6位,尾数有8位,可以表达的最大的浮点数为0.1111111112 * 2 ^ 1111112。注意小数点后一位必须有1,所以一共有9位小数。

0111111110111111

这个数换算成十进制之后就是0.998046875 * 2^63 = 9.205357638345294 * 10^18。你的任务是根据这个最大浮点数,求出阶码的位数E和尾数的位数M。输入格式AeB,表示最大浮点数A * 10^B。0 < A < 10,并且恰好包括15位有效数字。输入结束标志为0e0。对于每组数据,输出ME。输入保证有为一街,且0 <= M <= 9,1 <= E <= 30.


​ 该题的输入AeB十分奇怪,数与数之间插入了字母,那么我们选择先用字符数组读入,再进行处理:

char n[MAXN];
double a,b;
fgets(n,n + 60,stdin);//注意,fgets会读入最后的换行符,处理需谨慎
int p = 0;
while(n[p] != 'e' && n[p] != '\0')p++;
a[p] = ' ';
sscanf(n,"%lf%lf",a,b);//将a,b从n里面读入(e已被换成空格),同样,也有sprintf

​ 既然是关于二进制转换的,那么首先就写一个二进制转换代码。但是:对于每一个二进制小数,有一个唯一确定的十进制小数,但对于一个十进制小数,其算出的二进制小数一般都具有误差!!(具体参见十进制转二进制计算方法)

​ 因此,从十进制推二进制的路就走不通了。鉴于此题ME的取值范围不算太大,那么,尝试二进制推十进制?

基本思路:

​ 枚举ME的大小,即尾数的尾数和阶码的位数。通过这样,我们就可以算出对于每一对ME所唯一确定的十进制最大小数,进而与AeB进行比较,选择差距最小的进行输出。

ME的枚举代码如下:

double m[10] = {0.5},k = 0.5;//当m = 0的时候,其实仍有一位小数(参见题目),因此m[0] = 0.5
double e[40] =
for(int i = 1; i <= 9; i++){
m[i] = m[i - 1] + k / 2;//二进制小数化十进制
k /= 2;
}
int c = 2;
for(int i = 1; i <= 30; i++){
e[i] = c - 1;
c *= 2;
}

​ 乍看上去,似乎是一个不错的代码。但是忽视了一个问题,E最大为30,那么就会乘上2(230),二的三十次方约为10亿,该数的大小就不用赘述了。因此,这样的思路肯定行不通。那么稍作改进!!!

​ 由题意得:


A * 10B = M*2E


那么两边同时取以10为底的对数,仍相等,并可以显著减小数据量级,即:


log10A * B = log10M * E*log102


对于每个M,E进行如是处理:

double m[10] = {0.5},k = 0.5;
double e[40] =
for(int i = 1; i <= 9; i++){
m[i] = m[i - 1] + k / 2;
k /= 2;
}
for(int i = 0; i <= 9; i++){
m[i] = log10(m[i]);
}
int c = 2;
for(int i = 1; i <= 30; i++){
e[i] = (c - 1) * log10(2);//此步认真理解
c *= 2;
}

如此过后,再进行比对,记录答案

全代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 60;
char s[MAXN];
double ans[MAXN][MAXN];
double a;
double b;
void in(){
double m[15] = {0.5},e[30];
long long k = 2;
double t = 0.5;
for(int i = 1; i <= 9; i++){
m[i] = m[i - 1] + t / 2;
//cout << m[i] << " ";
t /= 2;
}
//cout << endl;
for(int i = 0; i <= 9; i++){
m[i] = log10(m[i]);
}
for(int i = 1; i <= 30; i++){
e[i] = (k - 1) * log10(2);
k <<= 1;
//printf("%lf\n",e[i]);
}
for(int i = 0;i <= 9; i++){
for(int j = 1; j <= 30; j++){
ans[i][j] = m[i] + e[j];
}
}
}
int main(){
in();
while(fgets(s,MAXN,stdin)){
if(strncmp(s,"0e0",3) == 0)break;//strncmp可以选择比对前多少位
int p = 0;
while(s[p] != 'e' && s[p] != '\0')p++;
s[p] = ' ';
sscanf(s,"%lf %lf",&a,&b);
b = a = log10(a) + b;//对原数取对数
int pi = 0,pj = 1;
for(int i = 0; i <= 9; i++){
for(int j = 1; j <= 30; j++){
if(fabs(a - ans[i][j]) < b){
b = fabs(a - ans[i][j]);
pi = i;
pj = j; }
}
}
cout << pi << " " << pj << endl;
}
}

(终)

浮点数(UVa11809)题解的更多相关文章

  1. FJUT寒假第一周作业浮点数查寻题解

    二分强化——浮点数序列查询 TimeLimit:4000MS  MemoryLimit:128MB 64-bit integer IO format:%I64d Problem Description ...

  2. 算法习题---3.12浮点数(UVa11809)

    一:题目 尴尬的非会员水印 二:题目摘要 1.int和float比较 int共32位,可以表示的最大的数为2^32次方 float虽然也是32位,但是是以指数形式保存,指数占8位(含符号),最大127 ...

  3. hdu2552 (浮点数复杂运算的四舍五入)题解

    三足鼎立 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  5. bestcoder Round #7 前三题题解

    BestCoder Round #7 Start Time : 2014-08-31 19:00:00    End Time : 2014-08-31 21:00:00Contest Type : ...

  6. codevs 1203 判断浮点数是否相等

    http://codevs.cn/problem/1203/ 1203 判断浮点数是否相等  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze 题解  查看运行 ...

  7. [POJ] #1004# Financial Management : 浮点数运算

    一. 题目 Financial Management Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 173910   Acc ...

  8. [POJ] #1003# Hangover : 浮点数运算

    一. 题目 Hangover Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 116593   Accepted: 56886 ...

  9. [九度OJ]1137.浮点数加法

    原题链接:http://ac.jobdu.com/problem.php?pid=1137 题目描述: 求2个浮点数相加的和题目中输入输出中出现浮点数都有如下的形式:P1P2...Pi.Q1Q2... ...

随机推荐

  1. 4┃音视频直播系统之浏览器中通过 WebRTC 进行桌面共享

    一.共享桌面原理 共享桌面在直播系统中是一个必备功能 共享者:每秒钟抓取多次屏幕,每次抓取的屏幕都与上一次抓取的屏幕做比较,取它们的差值,然后对差值进行压缩:如果是第一次抓屏或切幕的情况,即本次抓取的 ...

  2. 一图详解java-class类文件原理

    摘要:徒手制作一张超大的类文件解析图,方便通过浏览这个图能马上回忆起class文件的结构以及内部的指令. 本文分享自华为云社区<[读书会第十二期]这可能是全网"最大".&qu ...

  3. 零基础学Java第二节(运算符、输入、选择流程控制)

    本篇文章是<零基础学Java>专栏的第二篇文章,文章采用通俗易懂的文字.图示及代码实战,从零基础开始带大家走上高薪之路! 第一章 运算符 1.1 算术运算符的概述和用法 运算符 对常量和变 ...

  4. linxu篇-centos搭建ftp服务器

    1安装vsftpd 2备份配置文件 3修改配置文件 vi /etc/vsftpd/vsftpd.conf anonymous_enable=NO #允许匿名用户访问为了安全选择关闭 local_ena ...

  5. hdu多校题解

    hdu2020多校-1 J Math is Simple 给定 \(n\) ,求 \[\sum\limits_{1\le a<b\le n \\ gcd(a,b)=1 \\ a+b\ge n} ...

  6. 三面阿里,被Java面试官虐哭!现场还原真实的“被虐”场景

    前言 人人都有大厂梦,我也不例外,从大三开始,就一直想进入阿里工作,大毕竟是大厂,想想也没那么容易,不过好在自己学历还过得去,项目经验也有得讲,所以今年也斗胆尝试了一下,直接就投了阿里云计算.简历是过 ...

  7. 【原创】项目三Raven-2

    实战流程 1,C段扫描,并发现目标ip是192.168.186.141 nmap -sP 192.168.186.0/24 扫描目标主机全端口 nmap -p- 192.168.186.141 访问8 ...

  8. python生产exe文件yi以及解释器配置等

    原文链接:https://blog.csdn.net/weixin_42691768/article/details/81044666 https://www.cnblogs.com/paulwhw/ ...

  9. 计算机环境变量的配置,以java为例以及eclipse简要设置

    安装JDK时可以不安装公共jre.因为好多软件和浏览器已经默认自带的jre了,或者自动调用系统的了. 在java 中需要设置三个环境变量(1.5之后不需要再设置CLASSPATH了,但需要的话可以设置 ...

  10. SAP Grid control( ALV Grid 列表 自定义 按钮)

    ALV 列表和按钮 效果 源代码 PROGRAM bcalvc_tb_menu_with_def_but. *&&&&&&&&& ...