pat1010Radix (25)

56 篇文章 0 订阅

题意分析:

(1)给出两个正整数,给出其中一个正整数的基底,求另外一个正整数的基底,使得这两个正整数在各自的基底的十进制数相等

(2)先求出给出基底的那个正整数在十进制下的值,求另外一个数的基底,很容易想到的是依次遍历基底,但遍历的边界在哪里?如何确定边界是要首先解决的问题:下界比较容易,题意说明给出正整数的每一位数字都要小于其基底,因此遍历的基底的下界就是各数位最大数字+1,那么遍历的上界如何确定?到底选择多大才算合适?如果小了,那么就有可能遍历不到,如果大了,那就可能浪费效率。那么我们就需要分析了:假设第一个正整数我们已经求出它的十进制值为X,那么请问我们第二个正整数的基数得有多小,以至于我们的基底必须足够大,才能使得至少第二个正整数不小于第一个正整数?用通俗的话说,第二个正整数真是倒霉到自己取到了极小的非0和1的下限了(也就是10),这个时候,我只能依靠我的基底来扳回败局,这样求出来的基底就是X,但凡只要我基数稍微比10大,我的基底就不需要如此拼命!这个时候如果我的基底是X,那么最后一定能遍历到最终的基底。由此看来,遍历的上限就是X。

(3)好了,上下界确定了,请问怎么遍历呢?顺序遍历吗?对不起。。。你可以试试,一定超时,那我们能想到的就剩下什么?对了,二分搜索

可能坑点:

(1)遍历范围随意选择了一个很大的整数,导致超时

(2)顺序遍历导致超时

#include <iostream>
#include <string.h>
#include <ctype.h>
using namespace std;
char array1[11];
char array2[11];

long long get_num(char num[],int radix)
{
    long long sum=0;
    int n=strlen(num);
    int i=0;
    while(i<n)
    {
        if(isalpha(num[i]))sum=(sum*radix)+num[i]-'a'+10;
        else sum=(sum*radix)+num[i]-'0';
        i++;
    }
    return sum;
}

long long getMinRadix(char num[])
{
    long long max=1;
    int n=strlen(num);
    int i=0;
    while(i<n)
    {
        if(isalpha(num[i]))
        {
            if(max<num[i]-'a'+10)max=num[i]-'a'+10;
        }
        else
        {
            if(max<num[i]-'0')max=num[i]-'0';
        }
        i++;
    }
    return max+1;
}

void getRadix(char num[],long long minRadix,long long max)
{
    long long maxRadix=max+1;
    long long midRadix;
    while(minRadix<=maxRadix)
    {
        midRadix=(minRadix+maxRadix)/2;
        long long num2=get_num(num,midRadix);
        if(num2>max||num2<0)maxRadix=midRadix-1;
        else if(num2<max&&num2>0)minRadix=midRadix+1;
        else
        {
            cout<<midRadix<<endl;
            return;
        }
    }
    if(minRadix>maxRadix)cout<<"Impossible"<<endl;
}

int main()
{
    int tag,radix;
    long long num1;
    char temp[11];
    cin>>array1>>array2>>tag>>radix;
    if(tag==2)
    {
        memcpy(temp,array1,sizeof(array1));
        memcpy(array1,array2,sizeof(array2));
        memcpy(array2,temp,sizeof(temp));
    }
    num1=get_num(array1,radix);
    long long minRadix=getMinRadix(array2);
    getRadix(array2,minRadix,num1);
    return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值