L - Floating-Point Numbers



题目大意:题目向我们解释了浮点数在计算机中的储存方式,分为三部分,第一部分表示符号正负(0为正,1为负),第二部分为尾数M,第三部分为阶码E,在计算机中用二进制表示M和E的时候如果位数不同,那么它们所能表示的最大值也不同。题目要求我们将输入的十进制的指数形式的数转化为二进制表示,求出尾数M和阶码E。

借鉴了别人的思想,写了下。


代码如下。

#include<bits/stdc++.h>
using namespace std; 
int i, j;
double a[10][31],m[10],e[31];
void init() 
{
	for (i = 0;i < 10;i++)
		m[i] = 1 - pow(0.5, (i + 1));//计算m 
	for (j = 1;j < 31;j++)
		e[j] = pow(2,j) - 1;//计算e 
	for (i = 0;i < 10;i++)
		for (j = 1;j < 31;j++)
			a[i][j] = log10(m[i]) + e[j] * log10(2);//枚举 
}
int main()
{
	init();
	double A,t;//A为t的小数部分,t为十进制转化为二进制取对数后的值 
	int B;//B为t的整数部分 
	char s[25];
	while(cin>>s)
	{
		for (i = 0;;i++)
			if (s[i] == 'e')
			{
				s[i] = ' ';
				break;
			}//将e置空是为了方便读入A和B
		sscanf(s, "%lf %d", &A, &B);
		if (!A&&!B) break;
		t = log10(A)+B;
		for (i = 0;i < 10;i++)
			for (j = 1;j < 31;j++)
				if (fabs(a[i][j] - t) < 1e-4) goto loop;//允许实际误差<10^(1e-4)
		loop:
			cout<<i<<" "<<j<<endl; 
	}
	return 0;
}