【算法竞赛 入门经典】习题3-12浮点数(Uva11809)

一、题目

Uva11809

二、解题思路

  1. 题目给出了尾数位数M和阶码位数E的范围,且组合情况为300个,选择打表
  2. 二进制表示中的M和E与十进制表示中的A和B通过等式的变形,可以得出A和B的表达式
  3. log10(mx2^e)=log10(A)+B,因为题目中给出A的范围小于10,故B=int(log10(m)+e*log10(2)),A=log10(m)+e*log10(2)-B
  4. 根据题意,输入字符串的前17位表示A,str[17]是e,后面是B
  5. 输入与表中数据进行比对的时候注意,double的精度问题。

三、代码

#include<stdio.h>
#include<math.h>
#include<string.h>
int B[15][35];  //存放B的所有情况 
double A[15][35];  //存放A的所有情况 
void init(){ //打表 
	for(int i=0;i<10;i++){ //尾数的位数 
		for(int j=1;j<31;j++){ //阶码位数 
			long long e=pow(2,j)-1; //最大的阶码 
			double m=1-pow(2,-(i+1)); //最大的尾数
			double t=log10(m)+e*log10(2);
			B[i][j]=t;
			A[i][j]=pow(10,t-B[i][j]); 
		}
	}
}
int main(){
	init();
	char str[25];
	while(scanf("%s",str)!=EOF){
		if(strcmp(str,"0e0")==0){
			return 0;
		}
		str[17]=' '; //str[17]是e,将其置空,便于后面从str输入a和b 
		double a;
		int b;
		sscanf(str,"%lf %d",&a,&b); //从字符串输入相应格式的数字到a和b 
		int i,j,flag=0;
		for(i=0;i<10;i++){ //查表 
			for(j=1;j<31;j++){  
				if((b==B[i][j]) && (fabs(a-A[i][j])<1e-4)){ //此处注意double精度问题 
					printf("%d %d\n",i,j);
					flag=1;
					break;
				}
			}
			if(flag){
				break;
			}
		}
	} 
	return 0;
} 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值