1010. Radix (25)

#include<iostream>
#include<cstring>
using namespace std;
long long Cal(char a)
{
	if (a >= '0'&&a <= '9')
		return a - '0';
	else
		return a - 'a' + 10;
}
long long NUM(char N[], long long radix)
{
	long long sum = 0;
	long long i;
	for (i = 0; i <strlen(N); i++)
	{
		sum = Cal(N[i]) + sum*radix;
		if (sum<0)
			return -1;		//sum值过大产生溢出
	}
	return sum;
}
long long MR(char N[])
{
	long long max = 0;
	for (long long i = 0; i < strlen(N); i++)
		if (Cal(N[i]) > max)max = Cal(N[i]);
	return max + 1;
}
int main()
{
	char N1[15], N2[15];
	int Tag;
	long long Radix;
	cin >> N1 >> N2 >> Tag >> Radix;
	if (Tag == 2)
	{
		char tmp[15];
		strcpy(tmp, N2);
		strcpy(N2, N1);
		strcpy(N1, tmp);
	}
	long long num1 = NUM(N1, Radix);
	long long right = num1 + 1;
	long long left = MR(N2);

	while (left <= right)
	{
		long long center = (left + right) / 2;
		if (NUM(N2, center) > num1 || NUM(N2, center) == -1)
			right = center - 1;
		else if (NUM(N2, center) < num1)
			left = center + 1;
		else
		{
			cout << center;
			return 0;
		}
	}
	cout << "Impossible";
	return 0;
}

考的二分查找,关键还是题目没读懂

二分查找的上下界是给了进制的数到另一个可能的最小进制(MR函数)之间

最需要注意的就是,进制转换之后的数可能越界,在NUM函数中sum小于零,这个测试点中有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值