PAT-1010 Radix (25)

#include<stdio.h>
#include<string>
#include<cmath>
#include<iostream>
using namespace std;

int main()
{
  string a,b;
  int tag,radix;
  int anum,bnum;
  //freopen("1010-in.txt","r",stdin);
  //freopen("1010-out.txt","w",stdout);
  
  while(cin>>a>>b>>tag>>radix)
  {
     anum=bnum=0;
     string temp;
     if(tag==1)
     {
        int index=0;
        for(int j=a.length()-1;j>=0;j--)
        {
           anum+=(a[j]>='a'?a[j]-'a'+10:a[j]-'0')*pow(radix*1.0,index);
           index++;
        }  
        temp=b;
     }else
     {
        int index=0;
        for(int j=b.length()-1;j>=0;j--)
        {
           anum+=(b[j]>='a'?b[j]-'a'+10:b[j]-'0')*pow(radix*1.0,index);
           index++;
        } 
        temp=a;
     }
     //printf("anum=%d
",anum);  
     char max=0;
     //get max num; 
     for(int i=0;i<temp.length();i++)
     {
       if(temp[i]>max)
         max=temp[i];
     }
     int maxNum=(max>='a'?max-'a'+10:max-'0');
     bool flag=false;
     int ind;
     
     //printf("maxNum=%d
",maxNum);
     long long  maxRadix=0xffffffff;
     maxRadix=maxRadix>>1;
     for(ind=maxNum+1;ind<=maxRadix;ind++)
     {
        bnum=0;
        int index=0;
        for(int j=temp.length()-1;j>=0;j--)
        {
           bnum+=(temp[j]>='a'?temp[j]-'a'+10:temp[j]-'0')*pow(ind*1.0,index);
           index++;
        }
        if(bnum>anum)
           break;
        //printf("%d ",bnum);
        if(anum==bnum)
        {
            flag=true;
            break;
        }
     }
     
     if(flag)
     {
        printf("%d
",ind==1?ind+1:ind);
     }
     else
     {
         printf("Impossible
");
     }
  }
      
}

这道题目误以为基数最大就是36,只拿到19分,但是网上一查才知道基数可以很大很大,可以达到long long类型。如果用上面代码只能得到23分。用long long int是八位。网上说用二分查找,待做。。。。

这道题目觉得很坑,吃完饭再回来写写注意点

#include<stdio.h>
#include<string>
#include<cmath>
#include<iostream>
using namespace std;

int main()
{
  string a,b;
  int tag,radix;
  long long anum,bnum;
  freopen("1010-in.txt","r",stdin);
  freopen("1010-out.txt","w",stdout);
  
  while(cin>>a>>b>>tag>>radix)
  {
     anum=bnum=0;
     string temp;
     if(tag==1)
     {
        int index=0;
        for(int j=a.length()-1;j>=0;j--)
        {
           anum+=(a[j]>='a'?a[j]-'a'+10:a[j]-'0')*pow(radix*1.0,index);
           index++;
        }  
        temp=b;
     }else
     {
        int index=0;
        for(int j=b.length()-1;j>=0;j--)
        {
           anum+=(b[j]>='a'?b[j]-'a'+10:b[j]-'0')*pow(radix*1.0,index);
           index++;
        } 
        temp=a;
     }
     //printf("anum=%d
",anum);  
     char max='0';
     //get max num; 
     //printf("%s
",temp.c_str());
     for(int i=0;i<temp.length();i++)
     {
       if(temp[i]>=max)
         max=temp[i];
     }
     int maxNum=(max>='a'?max-'a'+10:max-'0');
     bool flag=false;
     //printf("maxNum=%d
",maxNum);
     long long int maxRadix=0xffffffff;
     //for(ind=maxNum+1;ind<=maxRadix;ind++)
     long long ind=maxNum+1;
     long long begin=maxNum+1;
     //long long end=anum+1;
     long long end=anum>maxNum?anum+1:maxNum+1;
     //printf("%ld
",e);
     printf("%s %s
",a.c_str(),b.c_str());
     if(a==b)
     {
        if(a.length()==1)
           printf("%d
",maxNum+1==1?2:maxNum+1);
        else
           printf("%d
",radix);
        continue;
     }
     while(true)
     {
        //printf("%lld
",e); ##long long类型用lld才能正常输出,否则有问题,ld是long int 
        ind=(begin+end)/2;
        //printf("%lld
",e);
        printf("begin=%lld,%lld,ind=%lld
",begin,end,ind);
        bnum=0;
        int index=0;
        for(int j=temp.length()-1;j>=0;j--)
        {
           bnum+=(temp[j]>='a'?temp[j]-'a'+10:temp[j]-'0')*pow(ind*1.0,index);
           index++;
           if(bnum>anum)//这边需要提前判断出来,提前出来,否则可能溢出long long 
              break;
        }
        if(anum==bnum)
        {
            flag=true;
            break;
        }
        if(begin>=end)//二分法循环是while(left<=right) 
           break;
        if(bnum>anum)
        {
           end=ind-1;
        }
        else if(bnum<anum)
        {
           begin=ind+1;
        }
     }
     
     if(flag)
     {
        printf("%ld
",ind==1?ind+1:ind);
     }
     else
     {
         printf("Impossible
");
     }
  }
      
}

这道题目刚开始从2迭代到INT.max只有两个数据没有过,估计是超时的,这道题目很奇怪,超时不报超时,而是报WA,这个有点坑爹。

网上找了一下,发现说迭代可能过不了,需要用二分查找来解决这个问题。二分查找的确是个很高效的算法的算法。暴力循环的时候需要可以考虑是否可以采用二分来解决。

while(left<=right)

{

   mid=(left+right)/2

   if(data[mid]>num)

       right=mid-1

   else if(data[mid]<num)

      left=mid+1

   else

     return mid;

}

}

这道题目二分查找来寻找adejx;这道题目另外一个坑就是你求出来的数在十进制数的会有超过long long的情况,这个时候也是报WA错误,而不是溢出,runtimeerror之类的。

另外小case,两个数目相等的时候的特判,另外aa aa 1 12==>12和a a 1 15==>11

(A65 a97 0 48)

原文地址:https://www.cnblogs.com/championlai/p/3980214.html