2020多校第六场

本文探讨了一种算法,该算法通过解析不同进制数的字符串表达,并进行数学运算来找出可能的进制基数。文章详细介绍了如何将字符转换为数值,执行加、减、乘、除操作,并验证等式是否成立,以确定正确的进制。

思路

暴力、模拟

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>

#define ll long long
using namespace std;
const int maxn=6e6+6;
const ll mod=998244353;
const ll MOD=998244353;

ll power(ll x,ll a)
{
    ll ans=1;
    while(a)
    {
        if(a&1)
        {
            ans=ans*x%mod;
        }
        x=x*x%mod;
        a>>=1;
    }
    return ans;
}
ll a,b,ans;
char optr;
int base;
bool isop(char c)
{
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='=')
        return 1;
    else
        return 0;
}
int getn(char c)
{
    if(c>='A')
        return c-'A'+10;
    else
        return c-'0';
}
void fun(string s)
{
    a=0;b=0;ans=0;
    int i;
    for(i=0;!isop(s[i]);i++)
    {
        a*=base;
        a+=getn(s[i]);
    }
    optr=s[i];
    for(i++;s[i]!='=';i++)
    {
        b*=base;
        b+=getn(s[i]);
    }
    for(i++;i<s.size();i++)
    {
        //cout<<getn(s[i])<<' ';
        ans*=base;
        ans+=getn(s[i]);
    }
}
int main()
{
    //std::ios::sync_with_stdio(false);cin.tie(0);
string s;
    //int T;cin>>T;
    while(cin>>s)
    {


        bool f=1;
        int Max=-100;
        for(int i=0;i<s.size();i++)
        {
            if(!isop(s[i]))
            {
                Max=max(Max,getn(s[i]));
            }
        }
        Max=max(Max,1);
        for(base=Max+1;base<17;base++)
        {
            fun(s);
            //cout<<a<<' '<<optr<<' '<<b<<' '<<ans<<endl;
            if(optr=='*'&&a*b==ans)
            {
                cout<<base<<endl;
                f=0;
                break;
            }
            else if(optr=='+'&&a+b==ans)
            {
                cout<<base<<endl;
                f=0;break;
            }
            else if(optr=='-'&&a-b==ans)
            {
                cout<<base<<endl;
                f=0;break;
            }
            else if(optr=='/'&&ans*b==a)
            {
                cout<<base<<endl;
                f=0;break;
            }
        }
        if(f)
            cout<<-1<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值