PAT 甲级1010

C++中 min_element和 max_element 函数的用法
https://blog.csdn.net/liuchuo/article/details/79580773

主要采用二分法、进制转换。注意36进制的转换方法:将任意进制转换为十进制,比较十进制数是否相等。对于工作量较大的遍历,可以采用二分法,时间复杂度为Nlog(N)

isdigit函数的用法
如果isdigit函数包含在ctype.h头文件中,那字符串为数字。
计算过程:原型: int isdigit(char c)。 
用法:#include <ctype.h>。
  功能:判断字符c是否为数字。
  说明:当c为数字0-9时,返回非零值,否则返回零。
  
这题坑太难排了!!!!!
radix的范围大小未知,2^64有可能是负数,也就是说进制转换后的数过大有可能是负数,所以这点要充分考虑。其次,二分法中判断条件一定要充分考虑,尽量不要把temp==num 放在else条件下,因为前面考虑不全真的很容易错。

#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
using namespace std;
long long baseConversion(string a, long long r1)
{
 long long sum = 0;
 int i;
 for (i = a.size()-1; i >=0 ; i--)
 {
  if (!isdigit(a[i] ))
  {
   sum += pow(r1,a.size() - 1 - i)*(a[i] - 'a'+10 );
  }
  else
  {
   sum += pow(r1, a.size() - 1 - i)*(a[i] - '0');
  }
 }
 return sum;
}
int findRadix(string b, long long deci)
{
 long long temp;
 char it = *max_element(b.begin(), b.end());
 long long low, high, mid;
 low = (isdigit(it) ? it - '0' : it - 'a' + 10) + 1; 
 high = max(deci,low);
 while (low <= high)
 {
  mid = (low + high) / 2;
  temp = baseConversion(b, mid);
  
  if(temp > deci||temp<0)
  {
   high = mid - 1;
  }
  else if(temp == deci&&temp!=0)
  {
   return mid;
  }
  else
  {
    low = mid + 1;
  }
 }
 return -1;
}

int main()
{
	string n1, n2;
 long long tag, radix;
 cin >> n1 >> n2 >> tag >> radix;
 if (tag == 1)
 {
  if (findRadix(n2, baseConversion(n1, radix)) == -1)
  {
   cout<<"Impossible";
  }
  else
  {
   cout << findRadix(n2, baseConversion(n1, radix));
  }
 }
 else if (tag == 2)
 {
  if (findRadix(n1, baseConversion(n2, radix)) == -1)
  {
   cout << "Impossible";
  }
  else
  {
   cout << findRadix(n1, baseConversion(n2, radix));
  }
 }
 return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值