PAT-1010 Radix

1010 Radix (25 分)

Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number.ios

Now for any pair of positive integers N1 and N2, your task is to find the radix of one number while that of the other is given.c++

Input Specification:

Each input file contains one test case. Each case occupies a line which contains 4 positive integers:git

N1 N2 tag radix算法

Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set { 0-9, a-z } where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number radix is the radix of N1 if tag is 1, or of N2 if tag is 2.less

Output Specification:

For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print Impossible. If the solution is not unique, output the smallest possible radix.this

Sample Input 1:

6 110 1 10spa

Sample Output 1:

2code

Sample Input 2:

1 ab 1 2ci

Sample Output 2:

Impossibleget

算法說明:

已知一個數和其基數,求另外一個數的基數使得這兩個數相等。數字表示使用[0-9a-z],很容易看出基數的範圍是[2-36],若是已知數很大,基數是會超出36的,可能會很大很大,用long long 來存儲這個基數,若是你用暴力遍歷查找基數,時間會超時,能夠用二分查找。

#include <iostream>
#include <cstring>
using namespace std;
#define Max 3
// 轉成十進制 
long long toDecimal(char *N,long long radix){
    long long decimal=0;
    for(int i=0;i<strlen(N);i++){
        if(N[i]<58)
            decimal=decimal*radix+(N[i]-48);   
        else
            decimal=decimal*radix+(N[i]-87); // a-z ,10-35 呵呵 
    }
    return decimal;
}
//找出串中最大值 
int maxValueStr(char *N){
    int max=0;
    for(int i=0;i<strlen(N);i++)
        if(N[i]<58&&N[i]-48>max)
            max=N[i]-48;
        else if(N[i]-87>max)
            max=N[i]-87; 
    if(max>1)
        return max;
    else
        return 1;
}
int compare(char *N,long long radix,long long target){
    long long decimal=0;
    for(int i=0;i<strlen(N);i++){
        if(N[i]<58)
            decimal=decimal*radix+(N[i]-48);
        else
            decimal=decimal*radix+(N[i]-87);
        if(decimal>target||decimal<0)
            return 1; 
    }
    if(decimal>target)
        return 1;
    else if(decimal<target)
        return -1;
    else
        return 0;
}
long long binarySearch(long long target,char *N,long long low,long long high){
    long long mid=low;
    
    while(low<=high){
        if(compare(N,mid,target)==1)
            high=mid-1;
        else if(compare(N,mid,target)==-1)
            low=mid+1;
        else
            return mid;
        mid=(low+high)/2;
    }
    return -1;
}   
int main(int argc, char* argv[])
{
    char *N[Max];
    
    long long radix,target;
    int tag;
    for(int i=0;i<Max;i++)
        N[i]=new char[10]();
    
    cin >> N[1] >> N[2] >> tag >> radix;
    
    target=toDecimal(N[tag],radix); //目標數轉成十進制比較 
    tag=(tag==1)? 2:1;
    long long max=(long long)maxValueStr(N[tag])+1;  // 出現最大值f 進製爲16 +1 
    
    if(target<=max){
        long long result=binarySearch(target,N[tag],max,36);
        if(result==-1)
            cout<<"Impossible";
        else
            cout<<result;
    }else{
        long long result=binarySearch(target,N[tag],max,target+1);
        if(result==-1)
            cout<<"Impossible";
        else
            cout<<result;
    }
    return 0;
}

2020考研打卡第十三天,星辰之變,驕陽豈是終點。

我要爭一口氣,不是想證實我了不得,我是要告訴你們,我失去的東西必定要拿回來。
相關文章
相關標籤/搜索