文章

119

粉丝

68

获赞

92

访问

20.1k

头像
求30的倍数 题解:数学优化
P1736 华东师范大学2020年机试题
发布于2025年2月8日 10:14
阅读数 94

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    cin >> s;

    // 统计每个数字的出现次数
    int count[10] = {0};
    for (char c : s) {
        count[c - '0']++;
    }

    // 检查是否包含 0
    if (count[0] == 0) {
        cout << -1 << endl;
        return 0;
    }

    // 计算所有数字之和
    int sum = 0;
    for (char c : s) {
        sum += (c - '0');
    }

    // 检查是否能被 3 整除
    if (sum % 3 != 0) {
        cout << -1 << endl;
        return 0;
    }

    // 构造最大数
    string result;
    for (int i = 9; i >= 0; i--) {
        while (count[i] > 0) {
            result += ('0' + i);
            count[i]--;
        }
    }

    cout << result << endl;
    return 0;
}

首先,30的倍数,除以30一定是整数,那么除以30的质因数分解也必然是整数,30=2*3*5;如果除2无余则必然偶数,如果除5无余则必然是0或者5,那么,基于这两条,最后一位必然是0,对于3的倍数一定全求和除3无余,我们首先根据这三样进行判断目前的数值存量是否是满足的,假如都满足了,那么这个不就是我们要的结果吗,当然,首先我们需要对这个全数位进行判断,找是否存在0,全位和是否是3的倍数,在基于这样的数学结构一定成立的基础...

登录查看完整内容


登录后发布评论

1 条评论
RingoCrystal
2025年2月8日 10:15

不推荐全排列函数,万一位数很长,这个n!复杂度的函数,是真干不了啥事

赞(0)