当前位置: 代码迷 >> 综合 >> PAT甲级-1010 Radix (25分)【推荐!!!】
  详细解决方案

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

热度:115   发布时间:2023-09-27 00:03:01.0

点击链接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)?radix数字长度>a(数字首位+1)*radix^{数字长度}>a(+1)?radix>a
那么:radix>a数字首位+1数字长度radix>\sqrt[数字长度]{\frac{a}{数字首位+1}}radix>+1a? ?
后来!!!: 我发现,case直接输出a就行了…???
公式都没派上用场!

我的代码:

#include<bits/stdc++.h>
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;//continuesum+=num*pow(radix,i);if(cmp!=-1&&str.length()==1&&sum!=cmp)return -2;//impossibleif(cmp!=-1&&sum>cmp)return -2;//impossible}if(cmp!=-1&&sum==cmp)return-3;//sameelse if(cmp!=-1)return -1;//continuereturn 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 7return 0;
}

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