思路:
没什么好说的,直接暴力遍历2到16进制看看有没有满足的就行。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inline int rd()
{
register int s=0,w=1;
register char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') w=-1;
ch=getchar() ;
}
while(ch<='0'&&ch<='9')
{
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
int main() {
string s;
while(cin>>s){
int len=s.length(),id1,id2;
for(int i=0;i<len;i++){
if(s[i]=='+'||s[i]=='-'||s[i]=='/'||s[i]=='*')
id1=i;
if(s[i]=='=')
id2=i;
}
int flag=0;
for(int r=2;r<=16;r++){
ll a=0,b=0,c=0,k=0;
for(int i=0;i<id1;i++){
int j;
if(s[i]>='0'&&s[i]<='9')
j=s[i]-'0';
else
j=s[i]-'A'+10;
if(j>=r){
k=1;
break;
}
a=a*r+j;
}
if(k==1)continue;
for(int i=id1+1;i<id2;i++){
int j;
if(s[i]>='0'&&s[i]<='9')
j=s[i]-'0';
else
j=s[i]-'A'+10;
if(j>=r){
k=1;
break;
}
b=b*r+j;
}
if(k==1)continue;
for(int i=id2+1;i<len;i++){
int j;
if(s[i]>='0'&&s[i]<='9')
j=s[i]-'0';
else
j=s[i]-'A'+10;
if(j>=r){
k=1;
break;
}
c=c*r+j;
}
if(k==1)continue;
// printf("r=%d,a=%lld,b=%lld,c=%lld\n",r,a,b,c);
if(s[id1]=='+'&&a+b==c){
flag=1;
printf("%d\n",r);
break;
}
if(s[id1]=='-'&&a-b==c){
flag=1;
printf("%d\n",r);
break;
}
if(s[id1]=='*'&&a*b==c){
flag=1;
printf("%d\n",r);
break;
}
if(s[id1]=='/'&&a%b==0&&a/b==c){
flag=1;
printf("%d\n",r);
break;
}
}
if(flag==0)printf("-1\n");
}
}