题面:
样例:
解题思路:
从2到16进制依次尝试即可,但要注意多种可能时输出最小的,如4/2=2应输出5。
AC代码
#include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
#include<stdlib.h>
#include<map>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
ll qpow(ll m,ll q)
{
ll ans=1;
while(q)
{
if(q&1)
ans=ans*m;
m=m*m;
q>>=1;
}
return ans;
}
int main()
{
map<char,long long> mp;
mp['1']=1;mp['2']=2;mp['3']=3;
mp['4']=4;mp['5']=5;mp['6']=6;
mp['7']=7;mp['8']=8;mp['9']=9;
mp['A']=10;mp['B']=11;mp['C']=12;
mp['D']=13;mp['E']=14;mp['F']=15;
char str[20],num1[16],num2[16],num3[16],f[2];
int len1,len2,len3,flag;
ll x=0,y=0,z=0;
while(scanf("%s",str)!=EOF)
{
flag=0;
memset(num1,0,16);
memset(num2,0,16);
memset(num3,0,16);
int t;
while(str[flag]!='+'&&str[flag]!='-'&&str[flag]!='*'&&str[flag]!='/')
{
num1[flag]=str[flag];
flag++;
}
len1=flag;
f[0]=str[flag];
flag++;
t=flag;
while(str[flag]!='=')
{
num2[flag-t]=str[flag];
flag++;
}
len2=flag-1-len1;
flag++;
len3=strlen(str)-flag;
t=flag;
while(str[flag]!='\0')
{
num3[flag-t]=str[flag];
flag++;
}
int q=0,maxn=0;
for(int r=2;r<=16;r++)
{
ll res1=0;
for(int i=0;i<len1;i++)
{
res1+=mp[num1[i]]*qpow(r,len1-1-i);
if(mp[num1[i]]>maxn)
maxn=mp[num1[i]];
}
ll res2=0;
for(int i=0;i<len2;i++)
{
res2+=mp[num2[i]]*qpow(r,len2-1-i);
if(mp[num2[i]]>maxn)
maxn=mp[num2[i]];
}
ll res3=0;
for(int i=0;i<len3;i++)
{
res3+=mp[num3[i]]*qpow(r,len3-1-i);
if(mp[num3[i]]>maxn)
maxn=mp[num3[i]];
}
//printf("%lld %lld %lld %c\n",res1,res2,res3,f[0]);
if(f[0]=='+')
{
//printf("yes\n");
if((res1+res2)==res3)
{
//printf("yes\n");
if(r>maxn)
{
printf("%d\n",r);
q=1;
break;
}
}
}
else if(f[0]=='-')
{
if((res1-res2)==res3)
{
if(r>maxn)
{
printf("%d\n",r);
q=1;
break;
}
}
}
else if(f[0]=='*')
{
if((res1*res2)==res3)
{
if(r>maxn)
{
printf("%d\n",r);
q=1;
break;
}
}
}
else if(f[0]=='/')
{
if((((res1/res2)*res2)==(res1))&&((res1/res2)==res3))
{
if(r>maxn)
{
printf("%d\n",r);
q=1;
break;
}
}
}
}
if(q!=1)
printf("%d\n",-1);
}
return 0;
}
总结:
1、注意题目要求
2、注意复制粘贴代码段时调整参数
3、本次代码写的太复杂