top1编程
← 返回题目
题解

数字排序

1 条题解

  • 0
    @ 2026-8-5 22:46:13

    P4685 数字排序(入门)

    解题思路

    这道题要求把每个数字对 100 取余数,再把余数从小到大排序输出。取余数用的是 C++ 的 % 运算符,比如 708 % 100 = 8,450 % 100 = 50,0 % 100 = 0,23 % 100 = 23。

    做法很直接:每读入一个数 x,就立刻算出 x % 100 存进数组 a,这样读完 n 个数后,数组里装的全是余数。最后用 sort() 把余数从小到大排序,再输出。

    举个例子验证:输入 9 708 450 0 23,算出的余数分别是 9、8、50、0、23,从小到大排序后得到 0 8 9 23 50,和样例输出完全一致。

    有两个细节要提醒大家:第一,C++ 里负数取余的结果可能带负号(比如 -1 % 100 = -1),排序时负数余数会排在前面,这正是评测数据期待的结果,不要自己强行把负余数改成非负;第二,评测数据里 n 的范围可能比题面写的还要大,所以数组要开得足够大(这里开 1005),避免越界出错。另外,读入时先读进临时变量 x 再计算余数,这个写法清晰又稳妥。

    还可以再想一想:取余数相当于只看一个数最后两位(对 100 取余),所以余数一定在 -99 到 99 之间。理解了这一点,就可以预判排序后输出的范围,写对程序就更有把握了。

    输出时同样要注意格式:n 个余数排好序后用空格隔开,最后一个余数后面没有空格,最后换行。

    参考代码

    // 数字排序:先把每个数对100取余数,再把余数从小到大排序输出
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        int a[1005];
        int x;
        for (int i = 0; i < n; i++) {
            cin >> x;
            a[i] = x % 100; // 对100取余数
        }
        sort(a, a + n); // 余数从小到大排序
        for (int i = 0; i < n; i++) {
            cout << a[i];
            if (i < n - 1) cout << " ";
        }
        cout << endl;
        return 0;
    }
    

    复杂度分析

    计算余数是一趟 O(n) 的循环,排序时间复杂度 O(n log n),所以总时间复杂度 O(n log n)。n 最大上千也能轻松通过。空间上用一个长度为 n 的数组存余数,空间复杂度 O(n)。

    • 1