zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    面试收集—hello,world 也有新花样
    div+css优缺点
    css固定textarea文本域尺寸
    Python if __name__ == "__main__":
    ActionScript3.0基础教程
    【转】Flex代码生成器 (FCG)
    手机第一博文
    TabNavigator只初始化第一个TAB 引发的未初始化对象错误
    如何对待懒惰的小孩
    对孩子真诚就是尊重孩子,不要随意表扬
  • 原文地址:https://www.cnblogs.com/championlai/p/3980214.html
Copyright © 2011-2022 走看看