ZJU-PAT 1010. Radix (25)
2014-06-30 00:28
405 查看
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 N1 and N2, 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 radixHere 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 10Sample Output 1:
2Sample Input 2:
1 ab 1 2Sample Output 2:
Impossible
[注意]
1.数据类型选择:输入10位数结合进制可得应选long long int,在某些情况下radix较大故也应该设置为long long int
2.算法选择:简单顺序遍历超时,根据数值随着进制单调增加考虑使用二分查找(下界选max(s[i])+1, 上界选max(s[tag]-->longint,下界))例子:11 b 1 10
3.算法优化剪枝:(1)当两个数均为1,输出2;(2)当两数相等但不为1时,输出radix (3)计算某进制对应的数时累计和超过num1即可返回结果。
#pragma warning (disable:4786)
#include<iostream> #include<iomanip> #include<string> #include<cstdio> #include<algorithm> #include<map> using namespace std; string a[3]; int tag,radix; long long int tolongint(string s,int dig) { long long int ans=0; long long int d=1; for(int i=s.size()-1;i>=0;i--) { int num; if(s[i]>='0' && s[i]<='9') num=s[i]-'0'; else num=s[i]-'a'+10; ans=ans+num*d; d*=dig; } return ans; } int Maxnum(string s) { int d=-1; for(int i=0;i<s.size();i++) { int num; if(s[i]>='0' && s[i]<='9') num=s[i]-'0'; else num=s[i]-'a'+10; if(num>d) d=num; } return d+1; } int main() { while(cin>>a[1]>>a[2]>>tag>>radix) { if(a[1]=="1" && a[2]=="1") { cout<<"2"<<endl; continue; } if(a[1]==a[2]) { cout<<radix<<endl; continue; } long long int num1=tolongint(a[tag],radix); int cur; if(tag==1) cur=2; else cur=1; bool flag=false; int begin=Maxnum(a[cur]); for(;;begin++) { long long int num2=tolongint(a[cur],begin); if(num2==num1) { flag=true; break; } else if(num2>num1) break; } if(flag) cout<<begin<<endl; else cout<<"Impossible"<<endl; } return 0; }
#pragma warning (disable:4786)#include<iostream>#include<iomanip>#include<string>#include<cstdio>#include<algorithm>#include<map>using namespace std;string a[3];long long int tag,radix;long long int num1;long long int tolongint(string s,long long int dig){long long int ans=0;long long int d=1;for(int i=s.size()-1;i>=0;i--){int num;if(s[i]>='0' && s[i]<='9') num=s[i]-'0';else num=s[i]-'a'+10;ans=ans+num*d;d*=dig;}return ans;}int cmp(string s,long long int dig){long long int ans=0;long long int d=1;for(int i=s.size()-1;i>=0;i--){int num;if(s[i]>='0' && s[i]<='9') num=s[i]-'0';else num=s[i]-'a'+10;ans=ans+num*d;if(ans>num1) return 1;d*=dig;}if(ans==num1) return 0;return -1;}int Maxnum(string s){int d=-1;for(int i=0;i<s.size();i++){int num;if(s[i]>='0' && s[i]<='9') num=s[i]-'0';else num=s[i]-'a'+10;if(num>d) d=num;}return d+1;}long long int Max(long long int a,long long int b){return a>b?a:b;}long long int BinarySearch(int cur){long long int L=Maxnum(a[cur]);long long int R=Max(L,num1),M;while(L<=R){M=(L+R)/2;int res=cmp(a[cur],M);if(res==0) return M;else if(res==1) R=M-1;else L=M+1;}return -1;}int main(){while(cin>>a[1]>>a[2]>>tag>>radix){if(a[1]=="1" && a[2]=="1"){cout<<"2"<<endl;continue;}if(a[1]==a[2]){cout<<radix<<endl;continue;}num1=tolongint(a[tag],radix);int cur;if(tag==1) cur=2;else cur=1;long long int ans = BinarySearch(cur);if(ans==-1) cout<<"Impossible"<<endl;else cout<<ans<<endl;}return 0;}
相关文章推荐
- PAT (Advanced Level) Practise 1010. Radix (25)
- 【PAT】1010. Radix (25)
- 【PAT甲级】1010. Radix (25)
- PAT-1010. Radix (25)
- PAT甲题题解-1010. Radix (25)-二分搜索
- PAT-A-1010. Radix (25)
- PAT 1010. Radix (25)
- PAT (Advanced Level) Practise 1010. Radix (25)
- 1010. Radix (25) PAT 甲级
- PAT(甲级)1010. Radix (25)
- PAT 1010. Radix (25)
- 【PAT】1010. Radix (25)
- PAT-甲级-1010 Radix(25)
- 【PAT Advanced Level】1010. Radix (25)
- PAT 1010. Radix (25)
- PAT 1010 Radix (25)没有通过
- PAT-1010 Radix (25)
- 【PAT-A】1010. Radix (25)
- PAT 1010. Radix (25) 变态题,各种坑点
- PAT 1010 Radix (25)