题意:以字符串的形式给出表达式,判断满足该表达式计算的最小进制。
思路:利用简单模拟的思想,从表达式中值最大符遍历到16,得出最小的进制,考虑0+0=0;除法不是整除。
注意:简单模拟思想。
#include <bits/stdc++.h>
using namespace std;
string s,s1,s2,s3;
char o;
int minr;
typedef long long ll;
void init(){
s1.clear();
s2.clear();
s3.clear();//空字符串
minr = 2;
}
ll cal(string s,int r){
ll re = 0;
for(char c:s){
if(isdigit(c)){
re = re*r+c-'0';
}
else{
re = re*r+c-'A'+10;
}
}
return re;
}
bool check(int r){
ll t1 = cal(s1,r);
ll t2 = cal(s2,r);
ll t3 = cal(s3,r);
if(o=='+') return t1+t2 == t3;
if(o=='-') return t1-t2 == t3;
if(o=='*') return t1*t2 == t3;
if(t2==0) return false;
if(t1%t2) return false;
return t1/t2 == t3;
}
void get_num(){
int now = 1;
for(char c:s){//遍历s
if(!isdigit(c)&&!isalpha(c)){ //isdigit()和isdigit()函数,分别判断是否是数字和字母
now++;
if(c!='=') o=c;
}
else{
//为数字
if(isdigit(c)){
minr = max(minr,c-'0'+1);
}
//为字母
else{
minr = max(minr,c-'A'+11);
}
if(now==1){
s1+=c;
}
else if(now==2){
s2+=c;
}
else{
s3+=c;
}
}
}
}
int get_ans(){
for(int i= minr;i<=16;i++){
if ( check(i) ) return i;
}
return -1;//不满足
}
int main(){
while(cin>>s){
init();
get_num();
cout<<get_ans()<<endl;
}
getchar();
return 0;
}