pat a1010 ac版6.11打卡(前几天家里出事未及时打卡)

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536
题目大意:这道题理解应该很简单不难,但是测试点天坑;给你两串字符,随后给你1或2以及一个进制数,给出1则将1对应的进制转化为十进制,求2对应的进制数;
题目思路:这道题测试点真的卡了我好久,开始的时候没考虑上下界,时间数据过大问题,直接顺序遍历得了24分说实话考试时候要得24分(见我上篇博文)我估计就放弃了毕竟考虑时间问题,但是是练习我对照各个大佬的代码发现其实自己的代码狗屁不是,在牛客上试了一下我的代码果然很多无法通过。几个坑点说一下:
1)这题数据过大所以所有数据都应该用ll int方法定义;
2)即便用了ll int部分数据依旧会过大,这时候就要考虑上界溢出的问题并把它舍去;
3)上下界的问题,下界很显然就是num数中数字最大的一个+1,比如数是85,下界应该是9;上界其实和下界是一个道理只是反过来想,应该去已知数sum2+1(没有+1会出错,比如0 0情况会错误);
4)必须用二分查找法,不然测试点7过不去会超时;给出满分图片和代码;
`# include<stdio.h>

include<math.h>

include<string.h>

int strtonun(char s){
    int num;
    if(s>=‘0’&&s<=‘9’)
        num=s-‘0’;
    else if(s>=‘a’&&s<=‘z’)
        num=s-‘a’+10;
    return num;
}
int main(){
    char n1[50],n2[50];
    long long int num1[50],num2[50],max1=-1,max2=-1;
    int tag ,radix,j;
    scanf("%s %s %d %d",n1,n2,&tag,&radix);
      long long int i,a,b,k=99999;
      long long int sum1=0,sum2=0;
    a=strlen(n1),b=strlen(n2);
    for(i=0;i<a;i++){
        num1[a-i-1]=strtonun(n1[i]);
            if(num1[a-i-1]>max1)
        max1=num1[a-i-1];
    }
    for(i=0;i<b;i++){
        num2[b-i-1]=strtonun(n2[i]);
         if(num2[b-i-1]>max2)
        max2=num2[b-i-1];
    }
    if(tag1) {
      for(i=0;i<a;i++){
          sum2+=(num1[i]*pow(radix,i));
      }
        long long int left=max2+1,right=sum2+1,mid;
        if(sum2<0)
            right=-1;
        while(left<=right) {
            mid=(left+right)/2;
        for(i=0;i<b;i++){
            sum1+=(num2[i]*pow(mid,i));
        }  
            if(sum1>sum2||sum1<0)
                right=mid-1;    
  else if(sum1<sum2)
               left=mid+1;
            else if(sum1
sum2){
       k=mid;
      right=mid-1;
  }
           sum1=0;
    
        }
       if(k99999)
            printf(“Impossible”);
  else if(k!=99999)
   printf("%lld",k);
    }
    else
       {
      for(i=0;i<b;i++){
          sum2+=(num2[i]*pow(radix,i));
      }
      long long int left=max1+1,right=sum2+1,mid;
        if(sum2<0)
            right=-1;
        while(left<=right){
            mid=(left+right)/2;
        for(i=0;i<a;i++){
   
            sum1+=(num1[i]*pow(mid,i));
        }
             if(sum1>sum2||sum1<0)
                right=mid-1;
           else  if(sum1<sum2)
                left=mid+1;
            else if(sum1
sum2){
       k=mid;
      right=mid-1;
           
  }
           sum1=0;
    
        }
       if(k==99999)
            printf(“Impossible”);
  else if(k!=99999)
   printf("%lld",k);
    }
 return 0;
}
`pat a1010 ac版6.11打卡(前几天家里出事未及时打卡)