您的位置:首页 > 其它

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 10
Sample Output 1:
2
Sample Input 2:
1 ab 1 2
Sample 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;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: