PAT1010

来源:互联网 发布:招聘渠道数据分析 编辑:程序博客网 时间:2024/05/07 02:38

1010. Radix (25)


参考了别人的代码,由于进制太大,可能会超出long long 所以要一个compare。

二分查找答案


#include <iostream>  #include <string.h>  using namespace std;   typedef long long LL;  LL str2Num(char * str, LL radix){      LL rst=0;for(int i=0;str[i];i++){rst*=radix;if(str[i]>='a')rst+=(str[i]-'a')+10;elserst+=(str[i]-'0');}return rst;}    LL calcRadix(char * str){ //最低进制int rst=-1;for(int i=0;str[i];i++)if(str[i]>='a')rst=max(rst,(str[i]-'a')+10);elserst=max(rst,(str[i]-'0'));return rst+1;}    int compare(char* str, LL radix, LL target){       LL rst=0;for(int i=0;str[i];i++){rst*=radix;if(str[i]>='a')rst+=(str[i]-'a')+10;elserst+=(str[i]-'0');if(rst>target)return 1;}if(rst > target) return 1;      else if(rst<target) return -1;      else return 0;  }    LL binarySearch(char* B, LL low, LL high, LL target){      LL mid,val;      while(low<=high){          mid = (low+high)/2;  val=str2Num(B,mid);        int res = compare(B,mid,target);          if(res > 0)              high = mid-1;          else if(res<0)              low = mid+1;          else return mid;      }      return -1;  }    int main() {      char A[12],B[12];      int chose;      LL radix,res;      cin>>A>>B>>chose>>radix;      if(strcmp(A,"1")==0&&strcmp(B,"1")==0) printf("2\n");      else if(strcmp(A,B)==0) printf("%d\n",radix);      else{          if(chose==1){              LL target = str2Num(A,radix);              LL least = calcRadix(B);              res = binarySearch(B,least,max(target,least),target);          }          else{              LL target = str2Num(B,radix);              LL least = calcRadix(A);              res = binarySearch(A,least,max(target,least),target);          }   if(res==-1) cout<<"Impossible"<<endl;           else cout<<res<<endl;      }      return 0;  }  



0 0
原创粉丝点击