PAT 1010 1010. Radix (25)

Sample Input 1:
6 110 1 10 
Sample Output 1:
2 
Sample Input 2:
1 ab 1 2 
Sample Output 2:
Impossible 

刚开始以为此题的范围会超过long long int,试过后发现并没有。另外题目说字符串里面的数字只有{0-9,a-z},让我以为radix的范围不会超过36,后来发现错了。更改后提交,发现有一个case超时了,估计这个case里的radix非常大,于是radix也采用long long int,并且采用二分搜索,这才解决超时问题。注意这VS下long long int应该定义成__int64,输入输出格式为%I64d。

代码

  1 #define __int64 long long
  2 #include <stdio.h>
  3 #include <string.h>
  4 
  5 long long calculateFunc(char *,long long);
  6 int maxDigit(char *);
  7 int char2num(char);
  8 int main()
  9 {
 10     long long N1,N2,radix;
 11     int tag;
 12     char str1[12],str2[12];
 13     char *p1,*p2;
 14     while(scanf("%s %s",str1,str2) != EOF){
 15         scanf("%d%I64d",&tag,&radix);
 16         if(tag == 1){
 17             p1 = str1;
 18             p2 = str2;
 19         }
 20         else{
 21             p1 = str2;
 22             p2 = str1;
 23         }
 24         N1 = calculateFunc(p1,radix);
 25         int radixMin = maxDigit(p2) + 1;
 26         if (radixMin < 2)
 27             radixMin = 2;
 28         int strN = strlen(p2);
 29         if(strN == 1){
 30             N2 = char2num(*p2);
 31             if(N2 == N1){
 32                 printf("%I64d ",N2+1);
 33             }
 34             else{
 35                 printf("Impossible ");
 36             }
 37             continue;
 38         }
 39         long long i = radixMin;
 40         N2 = calculateFunc(p2,i);
 41         int flag = 0;
 42         while(N2 <= N1){
 43             if(N1 == N2){
 44                 printf("%I64d ",i);
 45                 flag = 1;
 46                 break;
 47             }
 48             i *= 2;
 49             N2 = calculateFunc(p2,i);
 50         }
 51         if(!flag){
 52             long long s = i / 2,e = i;
 53             long long mid;
 54               while(e >= s){
 55                 mid = (s + e) / 2;
 56                 N2 = calculateFunc(p2,mid);
 57                 if(N1 == N2){
 58                     printf("%I64d ",mid);
 59                     flag = 1;
 60                     break;
 61                 }
 62                 else if (N1 > N2){
 63                     s = mid + 1;
 64                 }
 65                 else{
 66                     e = mid - 1;
 67                 }
 68               }
 69             if(!flag){
 70                 printf("Impossible ");
 71             }
 72         }
 73     }
 74     return 0;
 75 }
 76 
 77 long long calculateFunc(char *p,long long radix)
 78 {
 79     int n = strlen(p);
 80     int i;
 81     long long N = 0;
 82     for(i=0;i<n;++i){
 83         N = N * radix + char2num(*(p+i));
 84     }
 85     return N;
 86 }
 87 
 88 int maxDigit(char *p)
 89 {
 90     int n = strlen(p);
 91     int i;
 92     int m = -1;
 93     int t;
 94     for(i=0;i<n;++i){
 95         t = char2num(*(p+i));
 96         if (t > m)
 97             m = t;
 98     }
 99     return m;
100 }
101 
102 int char2num(char c)
103 {
104     if(c >= '0' && c <= '9')
105         return c - '0';
106     else if(c >= 'a' && c <= 'z')
107         return c - 'a' + 10;
108     else
109         return -1;
110 }