PAT1010 Radix

来源:互联网 发布:java官网下载jdk7 编辑:程序博客网 时间:2024/05/17 08:12

PAT的题真是。。

//1.虽然字母只到z,但是进制最大并不止35,那就真的可能超long long

//2.一个点会超时,二分,

//我果然太天真了,还在100左右试,人家进制直接开到num + 1,可是问题就是这样就不是递增的了,怎么能用二分呢

//除非数很小,1111111....但是进制很大,所以算出来也小于ull,但是这也只能过部分数字,对k进制下的所有10位数,没有用

#include <iostream>

#include <string>

using namespacestd;

typedef longlong ll;

typedef unsignedlonglong ull;


ull toradix(ull radix,string &a)

{

    ull sum =0,k =1;

    for (int i = a.size() -1; i >= 0; i --) {

        if(isdigit(a[i]))  sum += (a[i] - '0') * k;

        else sum += (a[i] -'a' +10) * k;

        k = k * radix;

    }

    return sum;

}

void binary(ull &l,ull &r,ull num,string &a)

{

    ull mid;

    while (r - l >1) {

        mid = (l + r) / 2;

        if(toradix(mid, a) < num) l = mid;

        else r = mid ;

    }

}

void check(ull num,string &a)

{

    int least =0;

    for (int i =0; i < a.size(); i ++) {

        if(isdigit(a[i])) least =max(least,a[i] -'0');

        else least =max(least,a[i] -'a' + 10);

    }

    ull l = least +1,r =max(l,num +1);

    binary(l,r,num,a);

    if(toradix(l, a) == num)printf("%lld\n",l);

    else if(toradix(r, a) == num)printf("%lld\n",r);

    elseprintf("Impossible\n");

}


int main()

{

    string a,b;

    ull t,radix;

    cin >> a >> b >> t >> radix;

    ull num1 =0,num2 =0;

    if(t ==1) {num1 =toradix(radix,a);check(num1,b);}

    else{ num2 =toradix(radix,b);check(num2,a);}

       return0;

}


原创粉丝点击