HDU 6828 Little Rabbit‘s Equation

Little Rabbit’s Equation

题意:给了一个式子,问你是否存在一个r进制 2<=r<=16 使得式子成立。
思路:字符串长度只有一个等号和运算符,字符串长度最多十五,15-2=13
,假设两个数极小,只占据一个字符,那么剩下一个数的长度就是13-2=11,最大为16进制,一个16进制长度是四位的2进制,也就是最多是2^44 不会炸long long.
那么直接处理出来 a 运算符 b = c
把a、运算符、b、c都搞出来,然后进行2到16进制枚举,把a、b、c都转换为10进制去计算是不是满足算式即可。

#include
using namespace std;
typedef long long ll;
int  q[130];
int NO;
ll check(string a,int k){

    ll ans=0;
    for(auto it: a){
        int z=q[it];
        if(z>=k ) {
            NO=1;return 0;
        }
        ans=ans*k+z;
    }
    return ans;
}
int main(){
    for(int i=0;i<=15;i++){
        if(i<=9) q[i+'0']=i;
        else q['A'+i-10]=i;
    }
    string s;
    ios::sync_with_stdio(0);
    while(cin>>s){
        string a,b,c;
        char k='~';
        for(int i=0;s[i];i++){
            if(s[i]=='='){
                c=s.substr(i+1,s.size()-i-1);
                break;
            }
            if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/'){
                k=s[i];continue;
                
            }
            if(k=='~') a+=s[i];
            else b+=s[i];
        }
        int flag=0;
        for(int i=2;i<=16;i++){
            NO=0;
            ll aa=check(a,i),bb=check(b,i);
            ll cc=check(c,i);
            if(NO) continue;
            if(k=='/'){
                if(aa%bb==0 && aa/bb==cc){
                    cout<<i<<endl;
                    flag=1;
                    break;
                }
            }
            if(k=='+' && aa+bb==cc) {
                    cout<<i<<endl;
                    flag=1;
                    break;
            }
            if(k=='*' && aa*bb==cc) {
                    cout<<i<<endl;
                    flag=1;
                    break;
            }
            if(k=='-' && aa-bb==cc) {
                    cout<<i<<endl;
                    flag=1;
                    break;
            }

        }
        if(!flag) cout<<"-1"<<endl;
    }
    return 0;
}

你可能感兴趣的:(暴力,模拟)