PAT甲级-1010 Radix (25分)【推荐!!!】

点击链接PAT甲级-AC全解汇总

题目:
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.

Now for any pair of positive integers N​1​​ and N​2​​ , your task is to find the radix of one number while that of the other is given.

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

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.

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.

Sample Input 1:

6 110 1 10

Sample Output 1:

2

Sample Input 2:

1 ab 1 2

Sample Output 2:

Impossible

题意:

注意:
对于case7 进制数很大的情况我的思路:
因为: ( 数 字 首 位 + 1 ) ∗ r a d i x 数 字 长 度 > a (数字首位+1)*radix^{数字长度}>a (+1)radix>a
那么: r a d i x > a 数 字 首 位 + 1 数 字 长 度 radix>\sqrt[数字长度]{\frac{a}{数字首位+1}} radix>+1a
后来!!!: 我发现,case直接输出a就行了…???
公式都没派上用场!

我的代码:

#include
using namespace std;

long long  string_to_int_withRADIX(string str,int radix,long long cmp=-1)
{
    long long  sum=0;
    reverse(str.begin(),str.end());
    for(int i=0;i<str.length();i++)
    {
        long long  num;
        if(str[i]>='0'&&str[i]<='9')num=str[i]-'0';
        else num=str[i]-'a'+10;
        //乘权相加
        if(cmp!=-1&&num>=radix)return -1;//continue
        sum+=num*pow(radix,i);
        if(cmp!=-1&&str.length()==1&&sum!=cmp)return -2;//impossible
        if(cmp!=-1&&sum>cmp)return -2;//impossible
    }
    if(cmp!=-1&&sum==cmp)return-3;//same
    else if(cmp!=-1)return -1;//continue

    return sum;//计算a
}

int main()
{
    string str1,str2,b;
    long long tag,radix_tag,a;
    cin>>str1>>str2>>tag>>radix_tag;

    if(tag==1)
    {
        a=string_to_int_withRADIX(str1,radix_tag);
        b=str2;
    }
    else
    {
        a=string_to_int_withRADIX(str2,radix_tag);
        b=str1;
    }

    int radix=2;

    //公式推导
    int b_0=(b[0]>='0'&&b[0]<='9')?(b[0]-'0'):(b[0]-'a'+10);
    if(b.length()>1)radix=pow((1.0*a/(b_0+1)),double(1/(b.length()-1)));

    while(radix<1000)
    {
        int flag=string_to_int_withRADIX(b,radix,a);
        if(flag==-1)radix++;
        else if(flag==-2){cout<<"Impossible";return 0;}
        else if(flag==-3){cout<<radix;return 0;}
    }
    cout<<a<<endl;//case 7
    return 0;
}

希望各位独立思考解题办法,就算想不出来看的别人AC代码,也是抱着学习的心态,而不是为了完成任务还复制粘贴发原创的文章。

你可能感兴趣的:(PAT)