#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int c2int(char c){
if('0'<=c&&c<='9')
return c-'0';
else
return c-'a'+10;
}
long s2decimal(char str[], long radix){
long digit, sum=0;
// 必须判断每一位是否小于radix
int i=0;
for(;i<strlen(str);i++){
digit=c2int(str[i]);
// radix应该是从大到小排列下来
//if(digit>=radix)return -1;
sum=radix*sum+digit;
// sum溢出
if(sum<0)return -1;
}
return sum;
}
int main(void){
char str1[15], str2[15], str[15];
int tag;
long radix;
long sum=0, num;
long low=2,high;
scanf("%s%s%d%ld", str1,str2,&tag,&radix);
if(tag==1){
sum=s2decimal(str1, radix);
strcpy(str, str2);
}else if(tag==2){
sum=s2decimal(str2, radix);
strcpy(str, str1);
}
// 二分查找。理性思考得出判断:2<=radix<=sum+1
// 输出最小进制
// only one digit,there exists multiple situations
if(strlen(str)==1&&c2int(str[0])==sum){
printf("%d\n", c2int(str[0])+1);
system("pause");
return 0;
}
high=sum+1;
while(low<=high){
num=s2decimal(str, (low+high)/2);
if(num==-1||num>sum)
high=(low+high)/2-1;
else if(num<sum)
low=(low+high)/2+1;
else if(num==sum){
printf("%d\n", (low+high)/2);
system("pause");
return 0;
}
}
printf("Impossible\n");
system("pause");
return 0;
}
bug测试用例:17 321 1 10
输出:2
本程序可以通过pat,但是radix<digit,pat判断有误!!!
应该在s2decimal方法中判断digit<radix,改进后的s2decimal方法:
long s2decimal(char str[], long radix){
long digit, sum=0;
// 必须判断每一位是否小于radix
int i=0;
for(;i<strlen(str);i++){
digit=c2int(str[i]);
// radix应该是从大到小排列下来
if(digit>=radix)return -2;
sum=radix*sum+digit;
// sum溢出
if(sum<0)return -1;
}
return sum;
}
如有错误,欢迎指正!