在十进制下是不成立的,但在 进制下是成立的,因为
现给出三个正整数 ,请求出最小的进制 满足 在 进制下成立。
如果不存在满足条件的 则输出 0。注意 进制数的每一位均小于 !
我傻,傻乎乎地写高精,只不过调得还满快的
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string p,q,r;
int x[1010],a[1010],b[1010];
char work(int x){
if(x<=9)return char(x+48);
return char(x+55);
}
int work2(char x){
if(isdigit(x))return x-48;
return x-55;
}
string jf(string st1,string st2,int t){
memset(x,0,sizeof(x));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
string ans="";
int k=-1,f=0,la,lb;
for(int i=st1.size()-1;i>=0;i--){
k++;
a[k]=st1[i]-48;
}la=st1.size();
k=-1;
for(int i=st2.size()-1;i>=0;i--){
k++;
b[k]=st2[i]-48;
}lb=st2.size();
for(int i=0;i<la;i++)
for(int j=0;j<lb;j++)
x[i+j]=x[i+j]+a[i]*b[j];
for(int i=0;i<1000;i++){
x[i+1]=x[i+1]+x[i]/t;
x[i]=x[i]%t;
}
for(int i=1000;i>=0;i--)
if(f)ans=ans+work(x[i]);
else if(x[i]!=0){
ans=ans+work(x[i]);
f=1;
}
if(f==0)ans=ans+'0';
return ans;
}
bool check(int x){
if(jf(p,q,x)==r)return true;
return false;
}
int main(){
cin>>p>>q>>r;
for(int i=2;i<=16;i++)
if(check(i)){
cout<<i;
return 0;
}
cout<<0;
return 0;
}
实际上,可以把 p
、q
、r
都转成 10
进制,看合不合法。
#include <bits/stdc++.h>
using namespace std;
int work(int x,string st){
int ans=0;
for(int i=0;i<st.size();i++)
if(st[i]-'0'>=x)return 0;//判断是否合法
ans=ans*x+st[i]-'0';
}return ans;
}
int main(){
string p,q,r;
cin>>p>>q>>r;
for(int i=2;i<=16;i++){
int p2=work(i,p),q2=work(i,q),r2=work(i,r);
if(p2*q2==r2){
cout<<i<<endl;
return 0;
}
}puts("0");
return 0;
}