标签:pat
#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; }
标签:pat
原文地址:http://blog.csdn.net/ldrmcml/article/details/43054599