程序设计 -- 整数排序

我们有 N个正整数,均小于 10000。现在需要将这些正整数按照该正整数每一位数字相加的和从小到大排序,即该正整数的每一位数字相加的和越小排位越靠前。如果各位相加和相等,则按照正整数的值从小到大排序。
输入格式
输入有 2 行
第一行为一个整数 NN,0 < N < 101;
第二行为用空格隔开的 N个正整数,均小于 10000。
输出格式
输出有 1 行,为按照题目要求排序后的 N 个正整数,用空格隔开。
样例
输入
4
20 12 1 11
输出
1 11 20 12
想请问一下能改一改下面这个程序吗

#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int x,int y){
    int sum=0,num=0;
    while(x<=0){
        sum+=x%10;
        x/=10;
    }
    while(y<=0){
        num+=y%10;
        y/=10;
    }
    if(sum>num)return 0;
    else if(sum<num)return 1;
    return x<y;
}
int main(){
    int a[1001];
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }
}

修改处见注释,供参考:

#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int x,int y){
    int sum=0,num=0,tmp_x=x,tmp_y=y;//修改
    while(x){ //while(x<=0){        //修改
        sum+=x%10;
        x/=10;
    }
    while(y){ //while(y<=0){        //修改
        num+=y%10;
        y/=10;
    }
    if(sum == num)    //修改 if(sum>num)return 0;
        return tmp_x < tmp_y;       //修改
    else             //修改  else if(sum<num)return 1;
        return sum < num;
                     //return x>y;
}
int main(){
    int a[1001];
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

此方法还得判断相等的情况,不推荐

bool cmp(int x,int y) {
    int sum=0,num=0;
    while(x) {
        sum+=x%10;
        x/=10;
    }
    while(y) {
        num+=y%10;
        y/=10;
    }
    if(sum>num)return 0;
    else if(sum<num)return 1;
    return x<y;
}