1010. Radix (25)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:57   2125   0
#include<iostream>
#include<cstring>
using namespace std;
long long Cal(char a)
{
 if (a >= '0'&&a <= '9')
  return a - '0';
 else
  return a - 'a' + 10;
}
long long NUM(char N[], long long radix)
{
 long long sum = 0;
 long long i;
 for (i = 0; i <strlen(N); i++)
 {
  sum = Cal(N[i]) + sum*radix;
  if (sum<0)
   return -1;  //sum值过大产生溢出
 }
 return sum;
}
long long MR(char N[])
{
 long long max = 0;
 for (long long i = 0; i < strlen(N); i++)
  if (Cal(N[i]) > max)max = Cal(N[i]);
 return max + 1;
}
int main()
{
 char N1[15], N2[15];
 int Tag;
 long long Radix;
 cin >> N1 >> N2 >> Tag >> Radix;
 if (Tag == 2)
 {
  char tmp[15];
  strcpy(tmp, N2);
  strcpy(N2, N1);
  strcpy(N1, tmp);
 }
 long long num1 = NUM(N1, Radix);
 long long right = num1 + 1;
 long long left = MR(N2);

 while (left <= right)
 {
  long long center = (left + right) / 2;
  if (NUM(N2, center) > num1 || NUM(N2, center) == -1)
   right = center - 1;
  else if (NUM(N2, center) < num1)
   left = center + 1;
  else
  {
   cout << center;
   return 0;
  }
 }
 cout << "Impossible";
 return 0;
}

考的二分查找,关键还是题目没读懂

二分查找的上下界是给了进制的数到另一个可能的最小进制(MR函数)之间

最需要注意的就是,进制转换之后的数可能越界,在NUM函数中sum小于零,这个测试点中有

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP