這道題還是很值得思考的,坑點也很多。一開始思路很亂,瞎寫了一番之後,只能拿到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;
}