题目大意
给一个方程,问在几进制下成立。( 若不成立输出-1, 若多组解输出最小的
允许有前导零,保证不会除0, 除是没有余数的那种除(
1
直接模拟(
我真的把所有坑都踩了一遍
注意int ->long long
注意00+00=0 是2进制不是1进制(
code
#include <bits/stdc++.h>
using namespace std;
ll getnum(string buf,ll bas){ // 把bas进制下的string buf转化成十进制的数字
int siz=buf.size();
ll res=0;
ll ba=1;
ll a;
for(int i=siz-1;i>=0;--i){
if(buf[i]>='A' && buf[i]<='F'){
a=buf[i]-'A'+10;
res=res+a*ba;
}
else{
a=buf[i]-'0';
res=res+a*ba;
}
ba=ba*bas;
}
return res;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);// 关同步
string s;
while(cin>>s){
int len=s.size();
int mx=0;
for(int i=0;i<len;++i){
if(s[i]>='A' && s[i]<='F') mx=max(mx,s[i]-'A'+10);
else if(s[i]>='0' && s[i]<='9') mx=max(mx,s[i]-'0');
}
int pos=-1,pos2=-1;
for(int i=0;i<len;++i){
if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/' ) {
pos=i;
}
if(s[i]=='='){
pos2=i;
break;
}
}
string a=s.substr(0,pos);
string b=s.substr(pos+1,pos2-pos-1);
string c=s.substr(pos2+1);
//cout<<a<<" "<<b<<" "<<c<<endl;
bool fla=0;
int ss=max(2,mx+1);
for(ll i=ss;i<=16;++i){
ll aa=getnum(a,i);
ll bb=getnum(b,i);
ll cc=getnum(c,i);
if(s[pos]=='+'){
if(aa+bb==cc){
cout<<i<<endl;
fla=1;
break;
}
}
else if(s[pos]=='-'){
if(aa-bb==cc){
cout<<i<<endl;
fla=1;
break;
}
}
else if(s[pos]=='*'){
if(aa*bb==cc){
cout<<i<<endl;
fla=1;
break;
}
}
else if(s[pos]=='/'){
if(bb*cc==aa){
cout<<i<<endl;
fla=1;
break;
}
}
}
if(!fla) cout<<-1<<endl;
}
}