学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
小猴对一个数的数位之和很感兴趣,今天他要按照数位之和给序列
a
1
,
a
2
,
…
,
a
n
a_1,a_2,\dots,a_n
a1,a2,…,an排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面,保证所有整数互不相同。
例如,
1001
1001
1001排在
99
99
99前面,因为
1001
1001
1001的数位之和是
2
2
2,而
99
99
99的数位之和
18
18
18。
又如,
2
2
2排在
101
101
101前面,因为它们的数位之和相同,而
2
2
2小于
101
101
101。
请你帮助小猴完成这个任务。
【输入】
第一行,包含一个正整数
n
n
n;
第二行,包含
n
n
n个正整数
a
1
,
a
2
,
…
,
a
n
a_1,a_2,\dots,a_n
a1,a2,…,an。
【输出】
一行,空格隔开的
n
n
n个整数,表示排序之后的序列。
【输入样例】
5
2 4 1 5 3
【输出样例】
1 2 3 4 5
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, a[100005];
int cal(int x) // 计算数位和
{
int sum = 0;
while (x>0) {
sum += x%10;
x /= 10;
}
return sum;
}
bool cmp (int x, int y)
{
if (cal(x)!=cal(y)) { // 数位和不同时
return cal(x)<cal(y); // 小的排前面
}
return x < y; // 否则数值小的排前面
}
int main()
{
cin >> n;
for (int i=1; i<=n; i++) cin >> a[i]; // 输入n个数
sort(a+1, a+n+1, cmp); // 按照自定义方式排序
for (int i=1; i<=n; i++) cout << a[i] << " ";
return 0;
}
【运行结果】
5
2 4 1 5 3
1 2 3 4 5