0
已解决
王月
资深守护
资深守护
3825 有趣的排序
经验值:1200 时间限制:1000毫秒
题目描述 Description
小明最近学习了很多的排序算法。老师想检验一下他的水平,给他出了一道题目:现在有n个数字,需要将他们按照位数之和从大到小的顺序进行排列,如果位数之和相同的话,则在按照数值大小,从小到大排列。
输入描述 Input Description
第一行输入一个整数n(n<=20000),表示数据的个数。
第二行输入n个空格隔开的整数,数值不超过100,000,000。
输出描述 Output Description
输出一行,n个空格隔开排序后的数据
样例输入 Sample Input
5 321 132 456 345 567
样例输出 Sample Output
567 456 345 132 321
WA30
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
string a[20010];
int sum(string a){
int s=0;
for(int i=0;i<a.size();i++){
s+=a[i]-'0';
}
return s;
}
bool cmp(string a,string b){
if(sum(a)!=sum(b)){
return sum(a)>sum(b);
}
return a<b;
}
int main(){
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;
}
0
已采纳
潘艺博
初级天翼
初级天翼
第一个函数要用到循环取位数
函数思路:定义函数int sm(int x),函数里定义sum变量,清零,再写while循环,while(x),while里面定义s=x%10,sum累加s,x/=10(循环取位数格式),返回sum
定义a数组用int型就可以了,存的下
其他的就没什么问题了~
望采纳~~
潘艺博在2021-08-29 15:54:45追加了内容
对了,你第二个函数定义形参也是int型
0
张皓轩
中级光能
中级光能
核心:
int weishu(long long x){
long long sum=0;
for(;x;x/=10){
sum+=x%10;
}
return sum;
}
bool cmp(int x,int y){
if(weishu(x)!=weishu(y)){
return weishu(x)>weishu(y);
}
return x<y;
}
主函数自己想
求采纳
0