二分实测,存在输入样例:193602 3102 1 10 (测试点3,4)
存在输入样例:6 110 2 2 (测试点1)
需要注意题目没有说明最大的进制是36以内的,而Java中BigIntege(x,radix)中 radix的范围被限定在36内,故无法使用这个方法进行进制转换
以下是C++代码,样例7没过,存疑,猜测应该是进制过大,long long溢出了,但改了溢出判断也还是WA了,还麻烦知道的同学指点一下
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll convert(string a,int radix)
{
ll ans=0;
for(int i=0;i<a.length();i++)
{
ans*=radix;
ans+=isdigit(a[i])? a[i]-'0':a[i]-'a'+10;
}
return ans ;
}
int find_min(string n)
{
char it = *max_element(n.begin(), n.end());
return (isdigit(it)? it-'0':it-'a'+10)+1;
}
int main()
{
string N1,N2;
int tag,radix;
cin>>N1>>N2>>tag>>radix;
string N3=(tag==1 ? N1:N2); //N是radix进制的一个数
ll N3_num=convert(N3,radix);
string N4=(tag==2 ? N1:N2); //某个进制的N4,要与N3比较
ll N4_num=convert(N4,radix);
//比较方法:将N4转换为10进制,将N3转换为10进制
ll low=find_min(N4);
ll high;
if(N4_num<10) high=low; //此处上限设置出问题,导致样例7过不了
else high=50;
while(low<=high)
{
int mid=(low+high)/2;
if(convert(N4,mid)==N3_num)
{
cout<<mid;
return 0;
}
else if(convert(N4,mid)<N3_num) low=mid+1;
else high=mid-1;
}
cout<<"Impossible";
}
新知识:
1、字符串中取出asc码最大的一个字符 char it = *max_element(n.begin(), n.end());
2、isdigit()的使用 返回true表示是数字