PAT 1010 Radix——二分法

题解

原题链接

  1. 这一题的坑比较多,刚开始看到这题以为默认36进制以内,for循环一遍错了7、8个,实际上这个题的进制范围可以很大,但是当两个数都不为0时,一个数的进制不会超过另一个数的10进制表示(一个数不为0那么最小也是1,如果进制大于另一个数的10进制表示,那么两个数不可能相等)
  2. 这题的数据最好都用long long,int可能会溢出
  3. 进制是有下界的,比如说一个数的表示出现了‘a’,那么进制最小也应该是11进制,10进制下不可能有‘a’
  4. for循环一遍会超时(卡第7个测试点),二分法可以AC

AC代码

#include <iostream>
#define LL long long

using namespace std;

LL radixto10(LL radix, string s);
LL Binary_search(LL start, LL inf, string s, LL sum);

int main()
{
   string s1, s2;
   LL sum=0, tag, radix, ans;
   cin >> s1 >> s2 >>tag >> radix;
   if (tag==1)
   {
       sum = radixto10(radix,s1);
       s1 = s2;
   }
   else
       sum = radixto10(radix,s2);
   LL start=2, inf;
   for (int i=0; i<s1.length(); i++)
   {
       if (s1[i]>='a')
       {
           if (int(s1[i]-'W')>=start)
               start = int(s1[i]-'W')+1;
       }
       else
       {
          if (int(s1[i]-'0')>=start)
               start = int(s1[i]-'0')+1;
       }
   }
   inf = start;
   while (radixto10(inf,s1)<=sum && inf <= sum)
       inf *= 2;
   ans = Binary_search(start, inf, s1, sum);
   if (ans!=0)
       cout << ans;
   else
       cout << "Impossible";
   return 0;
}

LL radixto10(LL radix, string s)
{
   LL sum=0;
   for (int i=0; i<s.length(); i++)
   {
       if (s[i]>='a')
           sum = sum*radix+int(s[i]-'W');
       else
           sum = sum*radix+int(s[i]-'0');
   }
   return sum;
}

LL Binary_search(LL start, LL inf, string s, LL sum)
{
   if (inf < start)
       return 0;
   LL mid = (start+inf)/2;
   LL tmp = radixto10(mid, s);
   if (start==inf && tmp!=sum)
       return 0;
   else if (tmp == sum)
       return mid;
   else if (tmp > sum)
   {
       inf = mid-1;
       return Binary_search(start,inf,s,sum);
   }
   else
   {
       start = mid+1;
       return Binary_search(start,inf,s,sum);
   }
}

end

猜你喜欢

转载自blog.csdn.net/adventural/article/details/86754335