1010 Radix (25 分)
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 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
已知一个数字的进制,让你求另一个数字的进制能否使得最后2个数字相等
首先找到合法的最小的进制 向无限大循环,如果能相等就输出,超过了则停止循环。
这样写是有坑的,如果数字的位数比较小,而已知的另一个数特别大,特别是未知进制的那个数只有1位(这种情况不管进制如何,该数字的大小已经确定了)或者是两位(这种情况下随着进制的上升,该数字的大小上升的速度过慢)
所以要注意以上的情况会超时, 所以最好那出来特判一下。
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[11];
char b[11];
long long tag,r;
cin>>a>>b>>tag>>r;
long long c[11];
long long sc=0;
int l;
long long rm=-1;
int ll;
if(tag==1)
{
l=strlen(b);
ll=strlen(a);
for(int i=0;i<l;i++)
{
if(b[i]>='0'&&b[i]<='9')
c[i]=b[i]-'0';
else
c[i]=10+b[i]-'a';
rm=max(rm,c[i]);
}
long long k=1;
long long dat;
for(int i=ll-1;i>=0;i--)
{
if(a[i]>='0'&&a[i]<='9')
dat=a[i]-'0';
else
dat=10+a[i]-'a';
sc+=dat*k;
k*=r;
}
}
else{
l=strlen(a);
ll=strlen(b);
for(int i=0;i<l;i++)
{
if(a[i]>='0'&&a[i]<='9')
c[i]=a[i]-'0';
else
c[i]=10+a[i]-'a';
rm=max(rm,c[i]);
}
long long k=1;
long long dat;
for(int i=ll-1;i>=0;i--)
{
if(b[i]>='0'&&b[i]<='9')
dat=b[i]-'0';
else
dat=10+b[i]-'a';
sc+=dat*k;
k*=r;
}
}
if(l==1)
{
if(c[0]!=sc)
{
cout<<"Impossible"<<endl;
}
else cout<<rm+1<<endl;
return 0;
}
if(l==2)
{
sc=sc-c[1];
if(sc%c[0]!=0)
{
cout<<"Impossible"<<endl;
}
else{
long long lss=sc/c[0];
if(lss>c[0]&&lss>c[1])
{
cout<<lss<<endl;
}
else cout<<"Impossible"<<endl;
}
return 0;
}
for(long long i=rm+1;;i++)
{
long long zs=0;
long long k1=1;
for(int j=l-1;j>=0;j--)
{
zs+=c[j]*k1;
k1*=i;
}
if(zs==sc)
{
cout<<i<<endl;
break;
}
if(zs>sc)
{
cout<<"Impossible"<<endl;
break;
}
}
return 0;
}