将两个其它进制的数都转化为10进制,再对比两者是否相等即可。题目没说范围,据说会出到这样的数据:1234567890 10 1 10 ,于是必须使用二分来做,否则必然TLE。
部分正确代码:
#include<stdio.h>
#include<string.h>
char a[12],b[12];
#define NUM 1000
int dis(char a)
{
if(a>='0'&&a<='9')
return a-'0';
if(a>='a'&&a<='z')
return 10+a-'a';
return -1;
}
long long transfer(char *arr, int radix)
{
long long res=0;
int len=strlen(arr);
int i,j;
for(i=0;i<len;i++){
if(dis(arr[i])>=radix)
return -1;
res*=radix;
res+=dis(arr[i]);
}
return (long long)res;
}
int main()
{
int tag,radix,i;
long long p,q;
scanf("%s%s%d%d",a,b,&tag,&radix);
if(tag==1){
p=transfer(a,radix);
for(i=2;i<36;i++){
if(p==transfer(b,i)){
printf("%d",i);
return 0;
}
}
}
else {
q=transfer(b,radix);
for(i=2;i<NUM;i++){
if(q==transfer(a,i)){
printf("%d",i);
return 0;
}
}
}
printf("Impossible");
return 0;
}
别人的AC代码:
#include <cstdio>
#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
using namespace std;
char A[11];
char B[11];
long long least;
long long num2Dec(char * p,long long radix)
{
long long len=strlen(p);
long long m = 1;
long long num = 1;
long long sum = 0;
for(long long i=len-1;i>=0;i--)
{
if(p[i]>='a'&&p[i]<='z')
num= p[i] - 'a' + 10;
else if(p[i]>='0'&& p[i]<='9')
num=p[i] - '0';
sum+=num*m;
m*=radix;
}
return sum;
}
long long findLowRadix(char *p)
{
long long len=strlen(p);
long long low=0;
long long num;
for(long long i=len-1;i>=0;i--)
{
if(p[i]>='a'&&p[i]<='z')
num= p[i] - 'a' + 10;
else if(p[i]>='0'&& p[i]<='9')
num=p[i] - '0';
if(num+1>low)
low=num+1;
}
return low;
}
int compare(char* p,long long radix ,long long target)
{
long long len=strlen(p);
long long m = 1;
long long num = 1;
long long sum = 0;
for(long long i=len-1;i>=0;i--)
{
if(p[i]>='a'&&p[i]<='z')
num= p[i] - 'a' + 10;
else if(p[i]>='0'&& p[i]<='9')
num=p[i] - '0';
sum+=num*m;
m*=radix;
if(sum>target) //avoid overflow
return 1;
}
if(sum>target)
return 1;
else if(sum<target)
return -1;
else
return 0;
}
long long binarySearch(char *p,long long low,long long high,long long top)
{
long long mid = low;
long long tmp;
while(low<=high)
{
tmp = compare(p,mid,top);
if(tmp>0)
{
high = mid-1;
}
else if(tmp<0)
{
low = mid +1;
}
else
return mid;
mid = (low + high)/2;
}
return -1;
}
int main()
{
long long tag;
long long radix;
long long target;
long long least; // lowest possible radix
long long most; // highest possible radix
long long res;
cin>>A;
cin>>B;
cin>>tag;
cin>>radix;
if(1==tag)
{
target=num2Dec(A,radix);
least = findLowRadix(B);
most = (target + 1 > least + 1) ? target +1 :least +1;
res = binarySearch(B,least,most,target);
if(res==-1)
cout<<"Impossible"<<endl;
else
cout<<res<<endl;
}
else if(2==tag)
{
target=num2Dec(B,radix);
least = findLowRadix(A);
most = (target + 1 > least + 1) ? target +1 :least +1;
res = binarySearch(A,least,most,target);
if(res==-1)
cout<<"Impossible"<<endl;
else
cout<<res<<endl;
}
}