这道题还是很值得思考的,坑点也很多。一开始思路很乱,瞎写了一番之后,只能拿到13分,看了 这位博主 的解法之后,才有了思路,所以代码差不太多,在我这看不懂的也可以去他那试试。还有要注意的是对于可能出现的大数据处理都用long long好了,被坑太多次了。
#include<bits/stdc++.h>
using namespace std;
long long translate(string s,long long k)
{
long long num = 0;
for(int i=0;i<s.length();i++) //进制转换
{
if(s[i]>='0'&&s[i]<='9')
num += pow(k,s.length()-1-i)*(s[i]-'0');
else
num += pow(k,s.length()-1-i)*(s[i]-'a'+10);
}
return num;
}
main()
{
string s1,s2;
int tag,radix;
cin>>s1>>s2>>tag>>radix;
if(tag == 2) // 这里如果s2需要处理,直接s1,s2互换位置,就不用后面再if处理了
{
string temp = s1;
s1 = s2;
s2 = temp;
}
long long out = translate(s1,radix);
int strmax = -1;
for(int i=0;i<s2.length();i++) //找出各位数字中最大的
{
if(s2[i]>='0'&&s2[i]<='9')
{
if(s2[i]-'0'> strmax)
strmax = s2[i] - '0';
}
else
{
if(s2[i]-'a'+10 > strmax)
strmax = s2[i]-'a'+10;
}
}
long long down = strmax + 1; //因为进制不可能比最大数字小。 所以下限就是最大数字+1
long long up = max(down,out); //上限就是转换后的out自身,但可能出现out比下限还小的的情况,所以要特别处理。
while(down <= up) //下面就是常规二分法处理了
{
long long mid = (down+up) / 2;
long long res = translate(s2,mid);
if(res == out)
{
printf("%d",mid);
return 0;
}
else if(res > out || res<0)
{
up = mid- 1;
}
else if(res<out)
{
down = mid + 1;
}
}
printf("Impossible");
return 0;
}