PAT 1010

地址:https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536

题目需要注意的东西有点多,第一个:

是数据范围大小,数据最长10位,已经超出了int的范围,因此要用long long 

转化进制,有可能还是超出范围,在二分搜索的时候还有溢出的可能,此时也看做大。

代码如下:

#include<iostream>
#include<cstdio>
#include<string.h>

using namespace std ;

int getNum(char a)
{
    return a>'9'?a-'a'+10:a-'0';
}


long long getSNum(string s ,long long index)
{
    int len = s.length();
    long long Num = 0;

    for(int i =0 ; i < len ; i ++)
    {
        Num = Num *index  + getNum(s[i]);
    }
    return Num ;
}

long long Search(string s ,long long left , long long right , long long res )
{
    long long mid = -1 ;
    while(left <= right)
    {
        mid = (left+right)/2;
        long long Num = getSNum(s,mid);
        //cout << "~~~" << getSNum(s,mid) << endl ;
        if(Num>res || Num < 0 )//溢出,说明太大了
        {
                right = mid -1 ;
        }else if(Num== res)
        {
            return mid ;
        }
        else {
                left = mid +1 ;
        }
    }
    return mid ;
}

int main(){
    string n1 , n2 , b ;
    int tag , rdx ;
    long long a ;

    cin >> n1 >> n2 >> tag >> rdx ;

    if(tag == 1 )
    {
        a = getSNum(n1,rdx);
        b = n2 ;
    }else {
        a = getSNum(n2,rdx);
        b = n1 ;
    }
    long long  left = 0, right ;
    for(int i = 0 ; i < b.length() ; i ++)
    {
        left = getNum(b[i])>left?getNum(b[i]):left;
    }
    left ++ ;
    right = a > left ? a: left;
   // cout <<"   " << left <<"   " <<right <<endl;
    right = Search(b,left,right,a);
   // cout << right <<endl;
    if(getSNum(b,right)== a)
    {
        cout << right <<endl;
    }else {
        cout << "Impossible"<<endl;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_36616268/article/details/81147954
今日推荐