题目大意
给出两个数字,告诉你其中一个数字的基数,让你求出要使两个数字相等时的另外一个数的基数
解题思路
1.把已知基数的数转换成十进制
2.如果遍历每一个进制,会超时。因此使用二分法来查找对应的基数,每次都将待求解的数字转换成十进制再进行比较就好。
注意要点
注意数字超限的情况。相关的数字都要用长整形来记录,部分计算结果可能会超过长整形的数字范围。
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
string n1,n2;
int tag;
long long radix;
cin>>n1>>n2>>tag>>radix;
//根据tag,标记初始字符串与需要求解的字符串
string s1,s2;
if(1==tag)
{
s1=n1;
s2=n2;
}
else
{
s1=n2;
s2=n1;
}
//求出原始数字的十进制值
long long num=0;
int size=s1.length();
for(int i=0;i<s1.length();++i)
{
if(s1[i]>='0'&&s1[i]<='9')
num+=(s1[i]-'0')*pow(radix,size-i-1);
else
num+=(s1[i]-'a'+10)*pow(radix,size-i-1);
}
//遍历待求解数字,得到最大的字符
char cMax='0';
for(int i=0;i<s2.length();++i)
{
if(s2[i]>cMax)
cMax=s2[i];
}
//利用二分法查找进制,下限为cMax+1,上限为num+1
int min;
long long max;
if(cMax>='0'&&cMax<='9')
min=cMax-'0'+1;
else
min=cMax-'a'+10+1;
max=num+1;
//使用二分法进行查找
while(min<=max)
{
long long middle=(min+max)/2;
long long result=0;
size=s2.length();
for(int i=0;i<s2.length();++i)
{
if(s2[i]>='0'&&s2[i]<='9')
result+=(s2[i]-'0')*pow(middle,size-i-1);
else
result+=(s2[i]-'a'+10)*pow(middle,size-i-1);
if(result>num||result<0)
break;
}
if(result>num||result<0)
max=middle-1;
else if(result<num)
min=middle+1;
else
{
cout<<middle<<endl;
return 0;
}
}
cout<<"Impossible"<<endl;
return 0;
}