top1编程
← 返回题目
题解

数字之和

1 条题解

  • 0
    @ 2026-8-5 12:17:20

    解题思路

    题目要我们做两件事:

    第一件事:求每个字符串的数字之和。 字符串里每一位都是数字字符,把它们都转成数字加起来就行。字符转数字有个小技巧:s[j] - '0'。 因为字符 '0' 的 ASCII 码是 48,字符 '5' 的 ASCII 码是 53,53-48=5,所以减去 '0' 就把数字字符变成了数字本身。

    第二件事:把字符串按"由大到小"排序。 这里的"由大到小"指的是字典序(字母表顺序):从第一个字符开始比,谁的字符大谁就排在前面。 用样例验证:7289 624316 524 012048,第一位分别是 7、6、5、0,所以排成 7289 624316 524 012048。 (注意:是按字符串本身比,不是按数字之和比!524 的和只有 11,但它排在了和为 15 的 012048 前面。)

    排序我们用选择排序:让第 i 位轮流和后面所有的比,如果后面有更大的,就交换到前面来,最后从大到小排好。

    输出格式:

    • 第一行按输入顺序输出每个字符串的数字之和(注意这里不能排序,要按原来的顺序!)。
    • 第二行输出排序后的字符串。

    参考代码

    #include <iostream>
    using namespace std;
    // 用途:求每个字符串的数字之和,并把字符串按照从大到小(字典序降序)输出
    int main() {
        int n;
        cin >> n;
        string a[105];   // 保存输入的字符串(保持输入顺序)
        string b[105];   // 保存排序后的字符串
        int sum[105];    // 每个字符串的数字之和
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            b[i] = a[i];                 // 复制一份用于排序
            sum[i] = 0;
            for (int j = 0; j < a[i].size(); j++)
                sum[i] += a[i][j] - '0'; // 把每一位数字字符累加起来
        }
        // 第一行:按输入顺序输出每个字符串的数字之和
        for (int i = 0; i < n; i++) {
            if (i > 0) cout << ' ';
            cout << sum[i];
        }
        cout << endl;
        // 选择排序:让字符串从大到小排列(字典序降序)
        for (int i = 0; i < n - 1; i++)
            for (int j = i + 1; j < n; j++)
                if (b[j] > b[i]) swap(b[i], b[j]);  // 大的换到前面
        // 第二行:输出排序后的字符串
        for (int i = 0; i < n; i++) {
            if (i > 0) cout << ' ';
            cout << b[i];
        }
        cout << endl;
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:求数字之和时,每个字符串长度最多 200、最多 100 个字符串,总字符数约 20000,这部分是 O(总字符数)。选择排序有两层循环,最多 100×100=10000 次比较,是 O(n²)。两者加在一起也能瞬间算完。
    • 空间复杂度:存了数组 a 和 b,各最多 100 个字符串,是 O(n)。
    • 1