地址:https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536
题目需要注意的东西有点多,第一个:
是数据范围大小,数据最长10位,已经超出了int的范围,因此要用long long
转化进制,有可能还是超出范围,在二分搜索的时候还有溢出的可能,此时也看做大。
代码如下:
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std ;
int getNum(char a)
{
return a>'9'?a-'a'+10:a-'0';
}
long long getSNum(string s ,long long index)
{
int len = s.length();
long long Num = 0;
for(int i =0 ; i < len ; i ++)
{
Num = Num *index + getNum(s[i]);
}
return Num ;
}
long long Search(string s ,long long left , long long right , long long res )
{
long long mid = -1 ;
while(left <= right)
{
mid = (left+right)/2;
long long Num = getSNum(s,mid);
//cout << "~~~" << getSNum(s,mid) << endl ;
if(Num>res || Num < 0 )//溢出,说明太大了
{
right = mid -1 ;
}else if(Num== res)
{
return mid ;
}
else {
left = mid +1 ;
}
}
return mid ;
}
int main(){
string n1 , n2 , b ;
int tag , rdx ;
long long a ;
cin >> n1 >> n2 >> tag >> rdx ;
if(tag == 1 )
{
a = getSNum(n1,rdx);
b = n2 ;
}else {
a = getSNum(n2,rdx);
b = n1 ;
}
long long left = 0, right ;
for(int i = 0 ; i < b.length() ; i ++)
{
left = getNum(b[i])>left?getNum(b[i]):left;
}
left ++ ;
right = a > left ? a: left;
// cout <<" " << left <<" " <<right <<endl;
right = Search(b,left,right,a);
// cout << right <<endl;
if(getSNum(b,right)== a)
{
cout << right <<endl;
}else {
cout << "Impossible"<<endl;
}
}