点击链接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代码,也是抱着学习的心态,而不是为了完成任务还复制粘贴发原创的文章。