整数排序进阶

发布时间 2024-01-06 14:51:26作者: Boy^
#include <algorithm> // 引入算法库
#include <iostream>   // 引入输入输出流库
using namespace std; // 使用标准命名空间
/*
这段代码是一个C++程序,它的主要功能是读入一组整数,然后按照一种特定的排序规则对这些整数进行排序,最后输出排序后的结果。

首先,我们来看一下这个程序中定义的函数和变量:

bitadd(int a):这个函数接收一个整数a,然后返回这个整数的四位数字之和。例如,如果输入是1234,那么返回的结果就是1+2+3+4=10。
cmp(int a, int b):这个函数是用来比较两个整数的。它首先计算这两个整数的四位数字之和,如果这两个和相等,那么就比较这两个整数的大小;如果它们的和不相等,那么就根据它们的和的大小来决定这两个整数的大小关系。
main():这是程序的主函数。它首先读入一个整数n,然后读入n个整数并存储在数组arr中。然后使用sort()函数和cmp()函数对数组进行排序,最后输出排序后的结果。
这个程序的排序规则是先按照四位数字之和进行排序,如果四位数字之和相等,那么就按照整数的自然顺序进行排序。这种排序规则可以用来处理一些特定的问题,例如在处理一些与数字的千位、百位、十位和个位有关的问题时,可以先按照这四位数字的和进行排序,然后再按照整数的自然顺序进行排序,这样可以得到更加合理的结果。
*/

int bitadd(int a) { return a / 1000 + a / 100 % 10 + a / 10 % 10 + a % 10; } // 定义一个函数,用于计算一个整数的各位数之和

bool cmp(int a, int b) { // 定义一个比较函数,用于比较两个整数的各位数之和
    int c = bitadd(a); // 计算整数a的各位数之和
    int d = bitadd(b); // 计算整数b的各位数之和
    if (c == d) { // 如果两个整数的各位数之和相等
        return a < b; // 则按照整数的大小进行比较
    }
    else {
        return c < d; // 否则按照各位数之和的大小进行比较
    }
}

int main() { // 主函数
    int n; // 定义一个整数n,用于存储数组的长度
    cin >> n; // 从标准输入读取一个整数,赋值给n
    int arr[n]; // 定义一个长度为n的整数数组arr
    for (int i = 0; i < n; i++) { // 循环n次,每次从标准输入读取一个整数,赋值给数组arr的第i个元素
        cin >> arr[i];
    }

    sort(arr, arr + n, cmp); // 使用自定义的比较函数cmp对数组arr进行排序
    for (int i = 0; i < n; i++) { // 循环n次,每次将数组arr的第i个元素输出到标准输出
        cout << arr[i] << (i == n - 1 ? '\n' : ' '); // 如果i等于n-1,则输出换行符;否则输出空格分隔符
    }

    return 0; // 返回0,表示程序正常结束
}