PAT甲1010. Radix (25)

惭愧,这道题卡的比较久。目前仍有一个疑问没确定。
1.进制需用long long 型,不然可能存在溢出情况。
2.进制遍历需用二分法,否则测试点7会超时。
3.N2转换为10进制时,由于此时使用的进制参数可能相当大,转换结果会溢出,所以做溢出判断,若中途结果<0或大于N1即停止转换。
我在实际操作中,一个问题是暴力穷举,导致测试点7超时。改成二分法后,测试点10答案错误,参考了算法笔记的参考代码,修改了比较函数,结果通过了。但是逻辑上不知道有什么不同……想不通

#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <cmath>
#include <algorithm>
using namespace std;

char a[12],b[12];
long long N1;
long long radix1;
long long inf=(1LL<<63)-1;

long long transtoten(char a[],long long radix,long long t)
{
    long long result=0;
    int len=strlen(a);
    for(int i=0;i<len;i++)
    {
        if(a[i]>='a'&&a[i]<='z')
        {
            result=result*radix+a[i]-'a'+10;
        }
        else if(a[i]>='0'&&a[i]<='9')
        {
            result=result*radix+a[i]-'0';
        }
        if(result>t||result<0)return -1;
    }
    return result;
}

long long compare(char b[],long long radix,long long t)
{
    int len=strlen(b);
    long long num=transtoten(b,radix,t);
    if(num<0)return 1;
    else if(t>num)return -1;
    else if(t=num) return 0;
    else return 1;

}

int main()  
{       
    int tag;

    scanf("%s%s%d%lld",&a,&b,&tag,&radix1);
    if(tag==2)swap(a,b);
    N1=transtoten(a,radix1,inf);
    int m=0;
    for(int i=0;i<strlen(b);i++)
    {
        int x;
        if(b[i]>='0'&&b[i]<='9')
        {
            x=b[i]-'0';
        }
        else
        {
            x=b[i]-'a'+10;
        }
        if(x>m)m=x;
    }
    long long left=m+1;
    long long right=max(left,N1+1);
    long long mid;
    while(left<=right)
    {
        mid=(left+right)/2;
        int result=compare(b,mid,N1);
        if(result==0)break;
        else if(result>0)right=mid-1;
        else if(result<0)left=mid+1;
    }
    if(right<left)
    {
        printf("Impossible\n");
    }
    else
    {
        printf("%d\n",mid);
    }
    system("pause");
    return 0;
}
阅读更多
文章标签: 1010
个人分类: 算法笔记学习 PAT
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

PAT甲1010. Radix (25)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭