一、题目
二、解题思路
- 题目给出了尾数位数M和阶码位数E的范围,且组合情况为300个,选择打表
- 二进制表示中的M和E与十进制表示中的A和B通过等式的变形,可以得出A和B的表达式
- log10(mx2^e)=log10(A)+B,因为题目中给出A的范围小于10,故B=int(log10(m)+e*log10(2)),A=log10(m)+e*log10(2)-B
- 根据题意,输入字符串的前17位表示A,str[17]是e,后面是B
- 输入与表中数据进行比对的时候注意,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;
}