acwing114.国王游戏

高精度乘除法的应用

添加链接描述
转载算法

高精度乘法
vector<int> mul(vector<int> a, int b)   
{
    vector<int> c;
    int t = 0;
    for (int i = 0; i < a.size(); i ++)
    {
        t += a[i] * b;
        c.push_back(t%10);
        t /= 10;
    }
    while (t)
    {
        c.push_back(t%10);
        t /= 10;
    }
    return c;   // 乘出来的是 低位到高位
}
高精度除法:
vector<int> div(vector<int> a, int b)
{
    vector<int> c;
    int t= 0;
    bool flag = false;   //  用来去掉前导零        
    for (int i = a.size() - 1; i >= 0; i -- )    // 除法 从高位到低位 所以从后往前开始除
    {
        t = t * 10 + a[i];
        int x = t/b;
        if (flag || x) 
        {
            flag = true;
            c.push_back(x);
        }
        t %= b;  
    }
    // 算出来的是高位到低位 
    return vector<int> (c.rbegin(), c.rend());   // 作用 就是 将c倒置   也可以用 reverse(c.begin(), c.end());
}
**两个vector 比较大小**
vector<int> max_vec(vector<int> a, vector<int> b)
{
    if (a.size() > b.size()) return a;
    if (a.size() < b.size()) return b;
    if (vector<int> (a.rbegin(), a.rend()) > vector<int> (b.rbegin(), b.rend())) return a;
    return b;
}
**输出**
void outpush(vector<int> a)
{
   for (int i = a.size() - 1; i >= 0; i --  )
        cout << a[i];
    cout << endl;
}
**主函数**
int main ()
{
    int n, a, b;
    scanf ("%d", &n);
    for (int i = 0; i <= n; i ++ )
    {
        scanf ("%d%d",&a, &b);
        arr[i] = {a * b, a};
    }
    sort(arr + 1, arr + 1 + n);
    vector<int> product(1, 1);
    vector<int>  res(1, 0);
    for (int i = 0; i <= n; i ++ )
    {
        if (i) res = max_vec(res, div (product, arr[i].first/arr[i].second));
        product = mul(product, arr[i].second);
    }
    outpush(res);
    return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值