#include#include #include #include int i;//函数 求底数可能取的最小值low //输入char *p 返回intint getLow(char * p){ int l = strlen(p); int low; char max='0'; for(i=0;i max) max = p[i];//直接比较ASCII码 //printf("0=%d 9=%d a=%d z=%d",'0','9','a','z');//48 57 97 122 } if(max<='9'){ low = max-'0'+1;} else{ low = max-'a'+11;} return low;}//函数 数值字符串转换为十进制数值 //输入char *p, long long radix 返回long longlong long char2Decimal(char * p, long long radix){//可以用p[i]表示*p中的字符 int l = strlen(p); long long decimalResult = 0; for(i=0;i = 'a' && p[i] <= 'z') temp = p[i]-'a' + 10; if(p[i] >= '0' && p[i] <= '9') temp = p[i]-'0'; decimalResult = decimalResult*radix + temp; } return decimalResult;}//函数 输入的char *p 与 long long target比较大小int compare(char * p,long long radix,long long target){ long long sum = 0; //sum = char2Decimal(p, radix);//提交8 个case点错误,其中有7个是因为在计算sum时溢出了 int l = strlen(p); for(i=0; i = 'a' && p[i] <= 'z') temp = p[i]-'a' + 10; if(p[i] >= '0' && p[i] <= '9') temp = p[i]-'0'; sum = sum*radix + temp; if(sum > target) return 1;//sum*radix会变得很大,甚至超过z的9次方,所以要及时退出,避免溢出!!! } if(sum < target) return -1; else if(sum == target) return 0;}//函数 二分查找能让*p和target相等的radixlong long binarySearchRadix(long long low, long long high, char * p, long long target){//注意这里的low 是long long 而不是int //long long mid = (low + high)/2;//用这个会有1个case 10 错误,即使放在while循环内第一行也不行! long long mid = low;//mid初始化必须是low int result; while(low <= high){ /*mid = (low + high)>>1;*/ result = compare(p,mid,target); switch (result){ case -1: low = mid + 1; break; case 0: return mid; case 1: high = mid - 1; } mid = (low + high)>>1; } return -1;}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); char s[4][11]; int tag,low; long base; long long target,high,findRadix; char p[11]; for(i=0;i<4;i++){ scanf("%s",s[i]); } tag = atoi(s[2]); base = atol(s[3]); switch(tag){ case 1: target = char2Decimal(s[0],base);//已知的十进制数值 strcpy(p,s[1]); break; case 2: target = char2Decimal(s[1],base); strcpy(p,s[0]); break; } low = getLow(p); //底数可能取的最大值high = max(已知的十进制数值+1, low+1),所以底数可能是个很大的数,必须用long long high = target>low?target+1:low+1; findRadix = binarySearchRadix(low,high,p,target); if(findRadix >0 ) printf("%lld\n",findRadix); else if(findRadix == -1 ) printf("Impossible\n"); return 0;}
参考了:
http://blog.csdn.net/wzb56_earl/article/details/7330762