2020hdoj多校赛第六场1002

题目链接

题面:
在这里插入图片描述

样例:
在这里插入图片描述

解题思路:
从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、本次代码写的太复杂

猜你喜欢

转载自blog.csdn.net/weixin_44063734/article/details/107854739