1+1=10
18-9=9
AA*AA=70E4
7/2=3
针对此输入判断符合计算方法的最小的进制,保证都是整除,不是的话输出-1,长度为15,进制为2~16
字符串的分割将符号和三个数字分出来
-
换+
,/
换*
,使得此问题转换为检验+
或*
的运算,进制转换使得一切数字由自己的最高位+1进制
~16进制
遍历直到找到或者找不到
注意
0+0=0等全零操作
注意数据范围使用long long
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s,s1,s2,s3,o;
ll rtoten(string x, int r){
int len = x.size();
ll ans=0;
ll i = len-1,p=1;
while(i>=0){
if(x[i]>='A'){
ans+=(x[i]-'A'+10)*p;
}
else
{
ans+=(x[i]-'0')*p;
}
p*=r;
i--;
}
return ans;
}
int cacu1(string x,string y,string z,int r){
for(int i=r+1;i<=16;i++){
if(rtoten(x,i)+rtoten(y,i)==rtoten(z,i)){
return i;
}
}
return -1;
}
int cacu2(string x,string y,string z,int r){
for(int i=r+1;i<=16;i++){
// cout<<rtoten(x,i)<<' '<<rtoten(y,i)<<' '<<rtoten(z,i)<<' '<<i<<endl;
if(rtoten(x,i)*rtoten(y,i)==rtoten(z,i)){
return i;
}
}
return -1;
}
int main(){
while(cin>>s){
s1.clear();
s2.clear();
s3.clear();
o.clear();
s1+=s[0];
for(int i = 1; i < s.size(); i++){
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
o = s[i];
for(int j=i+1;j<s.size();j++){
if(s[j]=='='){
for(int k=j+1;k<s.size();k++){
s3+=s[k];
}
break;
}
else
s2+=s[j];
}
break;
}
else
s1+=s[i];
}
int maxnum;
string S = s1+s2+s3;
// cout<<S<<endl;
char c=S[0];
for(int i=1;i<S.size();i++)
{
if(S[i]>c)
c = S[i];
}
// cout<<c<<endl;
if(c>='A'){
maxnum = c-'A'+10;
}
else
{
maxnum = c-'0';
}
// cout<<s1<<' '<<s2<<' '<<s3<<' '<<o<<' '<<maxnum<<endl;
if(maxnum<=1){
printf("2\n");
continue;
}
int flag;
if(o=="+")
flag = cacu1(s1,s2,s3,maxnum);
else if(o=="-")
flag = cacu1(s2,s3,s1,maxnum);
else if(o=="*")
flag = cacu2(s1,s2,s3,maxnum);
else if(o=="/")
flag = cacu2(s2,s3,s1,maxnum);
if(flag!=-1)
printf("%d\n",flag);
else
printf("-1\n");
}
return 0;
}