UVA - 11809 Floating-Point Numbers

#include<stdio.h>
#include<string.h>
#include<math.h>

const double eps = 1e-4;

int main() {
	double M[20][40];
	long long E[20][40];
	// 打表 
	for (int i = 0; i <= 9; ++i) {
		for (int j = 1; j <= 30; ++j) {
			double m = 1 - pow(2, -1 - i), e = pow(2, j) - 1;
			double t = log10(m) + e * log10(2);
			E[i][j] = floor(t);
			M[i][j] = pow(10, t - E[i][j]);
		}
	}
	char s[20];
	double A;
	int B;
	while (scanf("%s", s) == 1) {
		if (!strcmp(s, "0e0"))
			break;
		s[17] = ' ';
		sscanf(s, "%lf%d", &A, &B);
		while (A < 1) {
			A *= 10;
			B -= 1;
		}
		// 查表
		for (int i = 0; i <= 9; ++i) {
			for (int j = 1; j <= 30; ++j) {
				if (B == E[i][j] && fabs(A - M[i][j]) < eps) {
					printf("%d %d\n", i, j);
					break;
				}
			}
		} 
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值