#include<bits/stdc++.h>
using namespace std;
long long convert(string a,long long int radix){
long long int sum=0;
int cnt=0,temp=0;
for(int i=a.size()-1;i>=0;i--){
//int cnt=0; 位置放错 除非条件重置crt 以后声明全部放在外面,条件需要重置值时放在里面,不能哪用到在哪声明容易 出错
temp=isdigit(a[i])? a[i]-'0':a[i]-'a'+10;
sum+=temp*pow(radix,cnt++);
}
return sum;
}
long long int findr(string a,long long b){
//该数的进制下限是数中数位的最大值+1
char temp=*max_element(a.begin(),a.end());
//long long int low=isdigit(temp)?temp-'0'+1:temp-'a'+10+1 ;//为什么需要加括号? 如果不加括号他会把后面那一块看成一部分,导致他为数 时没有+1,我想表达的是不论是数还是字母都应该加1
long long int low=(isdigit(temp)?temp-'0':temp-'a'+10) +1 ;
long long int high=max(low,b);
long long _1,mid;
while(low<=high){//可以等于
mid=(low+high)/2;
_1=convert(a,mid);
if(_1>b||_1<0){//溢出会溢成负的
high=mid-1;
}
else if(_1==b) return mid;
else low=mid+1;
}
return -1;//没有就return -1
}
int main(){
long long tag,_3;
char _1[50],_2[50];
scanf("%s %s %lld %lld",&_1,&_2,&tag,&_3);
long long _4=tag==1?convert(_1,_3):convert(_2,_3);
long long _5;
if(tag==1)
_5=findr(_2,_4);
else
_5=findr(_1,_4);
if(_5==-1) printf("Impossible");
else printf("%d",_5);
return 0;
}
总结
1.进制最小值是 输入数位中,最大的值加一,由于isdigit,如果不加括号,他就会把后面的看做一部分,导致我前面那部分没加一,本来应该是不管哪种情况,最后都要加一,因为我的划分错误,导致没有实现想法
2.要用long long 而且在数制转换时,有可能溢出为负 正正 负 不能漏判
3.二分法while (<=)等号不能丢,因为里面更新时直接减一,是闭区间,如果不带等号会少算一个值
4.之后只要不是条件重置crt 声明都放外边
英语
问题
无