1010. Radix (25)

1.此题较为重点

2.最小的radix为各位的数字最大值+1

3.采用二分法查找,l=radix,r=已知的数+1

4.要求的最大radix不一定是36

//#include<string>
//#include <iomanip>
#include<vector>
#include <algorithm>
//#include<stack>
#include<set>
#include<queue>
#include<map>
//#include<unordered_set>
//#include<unordered_map>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
using namespace std;
int c2int(char c)
{//字符转数字
	if (c <= '9'&&c >= '0')
		return c - '0';
	else if (c <= 'z'&&c >= 'a')
		return c - 'a' + 10;
}
int main(void) {

	string n1, n2;
	int tag;
	unsigned long long radix;
	cin >> n1 >> n2 >> tag >> radix;
	string s, t;
	if (tag == 1)
	{//tag为1,则radix是n1的进制数
		s = n1;
		t = n2;
	}
	else if (tag == 2)
	{//tag为2,则radix是n2的进制数
		s = n2;
		t = n1;
	}

	unsigned long long sInt = 0;
	for (int i = 0; i < s.size(); i++)
	{//把s转为十进制
		sInt = sInt*radix + c2int(s[i]);
	}

	unsigned long long minRadix = 2;
	for (int i = 0; i < t.size(); i++)
	{//求出最小的进制数
		minRadix = max(minRadix, (unsigned long long)(c2int(t[i]) + 1));
	}
	bool flag = false;
	unsigned long long result = 0;
	unsigned long long r = sInt + 1;//必须+1
	unsigned long long l = minRadix;
	//使用二分法去查找合适的radix
	while (l <= r)//必须要有等号!!
	{//从最小的进制数开始遍历
		unsigned long long j = (l + r) / 2;//没说明j最大是36进制
		unsigned long long tInt = 0;
		for (int i = 0; i < t.size(); i++)
		{//j为t的进制数,求出t在j进制下的十进制大小
			tInt = tInt*j + c2int(t[i]);
			if (tInt > sInt)
			{//如果尚未统计完,tInt就被sInt大,没必要再统计下去
				//说明j进制使得tInt>sInt,t的进制数要比j小
				break;
			}
		}
		if (tInt == sInt)
		{
			flag = true;
			result = j;
			break;
		}
		else if (tInt > sInt)
		{
			r = j - 1;
			/*flag = false;
			break;*/
		}
		else l = j + 1;
	}
	if (flag) cout << result << endl;
	else cout << "Impossible" << endl;


	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值