110503 The Archeologists' Dilemma

This solution gets "Wrong answer" result inhttp://www.programming-challenges.com/,

but it gets "Accepted" result inhttp://uva.onlinejudge.org/.

I don't know why so far.



// Suppose the given number is X, then
// X*(10^Y) < 2^N < X*(10^Y) + (10^Y) => Y*log10 + logX < N < Y*log10 + log(X+1)
// Another limitation is: Y > int(lgX) + 1

#include <math.h>
#include <iostream>

using namespace std;

static int SmallestIntLargerThan(long double x)
{
	return static_cast<int>(floor(x + 1.0));
}

static int GetPower(int y, long double log_2_10, long double log_2_x, long double log_2_x_plus_1)
{
	long double n = static_cast<long double>(SmallestIntLargerThan(y * log_2_10 + log_2_x));
	if (n < y * log_2_10 + log_2_x_plus_1)
		return static_cast<int>(n);

	return -1;
}

static void HandleNumber(long double x, long double log_2_10, long double ln_2, long double ln_10)
{
	long double ln_x = log(x);
	long double log_2_x = log(x) / ln_2;
	long double log_2_x_plus_1 = log(x + 1.0) / ln_2;

	int y = SmallestIntLargerThan(ln_x/ln_10) + 1;
	int n;
	while((n = GetPower(y, log_2_10, log_2_x, log_2_x_plus_1)) <= 0)
		++y;
	cout << n << endl;
}

static void Test()
{
	long double ln_2 = log(2);
	long double ln_10 = log(10);
	long double log_2_10 = ln_10 / ln_2;

	long double x;
	while(cin >> x)
		HandleNumber(x, log_2_10, ln_2, ln_10);
}

int main(int argc, char* argv[])
{
	Test();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值