【PAT】甲级1010 - Radix(二分 & 有坑)

题目链接:点击打开题目


这里写图片描述


这题思路并不是很难,但是有几个坑点!
①首先要用longlong类型应该不难看出来。
②试答案的时候不能顺序搜索,要用二分搜索。
③二分的边界要想对,最小的应该是数中最小的那个数+1,比如:123a,那么这个数最小的进制数为11(因为数中有a)。最大的边界应该为基准数的十进制值(例如:基准数的十进制为为1000000,另一个数为10,那么它可以是1000000进制的,也满足条件)。
④如果算的进制数太大时,可能会爆longlong,那么在计算中还要注意对溢出的判断(num<0)。


代码如下:

#include<queue>
#include<cmath>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
#define CLR(a,b) memset(a,b,sizeof(a))
#define PI acos(-1.0)
LL toNum(char c)        //转化为阿拉伯数字 
{
    if (c >= '0' && c <= '9')
        return c-'0';
    return c-'a'+10;
}
LL toDecimal(string str,LL radix)       //转到十进制 
{
    LL num = 0;
    LL ant = 1;
    for (int i = str.size()-1 ; i >= 0 ; i-- , ant *= radix)
    {
        num += ant * toNum(str[i]);
        if (num < 0 || ant < 0)     //需要判断这个,也许进制太大了呢 
            return -1;
    }
    return num;
}
int main()
{
    string a,b;
    int tag,radix;
    LL l,r,mid;
    cin >> a >> b >> tag >> radix;
    if (tag == 2)
        swap(a,b);
    LL base = toDecimal(a,radix);
    l = 2;
    r = base;
    for (int i = 0 ; i < b.size() ; i++)        //算出最低的进制数 
    {
        l = max(l , toNum(b[i])+1);
    }
    while (r >= l)      //二分查找第一个大于base的进制数 
    {
        mid = (l+r) >> 1;
        LL t = toDecimal(b,mid);
        if (t >= base || t == -1)       //-1时太大溢出了 
            r = mid-1;
        else
            l = mid+1;
    }
    if (toDecimal(b,l) == base)     //验证一下是否相等 
        cout << l << endl;
    else
        puts("Impossible");
    return 0;
}
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值