Сортировка по сумме цифр
Напишите программу, которая сортирует натуральные числа в массиве по убыванию суммы цифр десятичной записи числа. При равенстве сумм цифр числа должны сохранить исходный порядок.
Входные данные
Первая строка содержит размер массива N. Во второй строке через пробел задаются N чисел — элементы массива. Гарантируется, что 0 <N≤ 1000 .
Выходные данные
Программа должна вывести в одной строке элементы массива, отсортированного в порядке убывания суммы цифр десятичной записи числа, разделив их пробелами.
Примеры
Ввод
6
9 21 32 55 81 11
Вывод
55 9 81 32 21 11
На проверке пишет, что программа выдаёт неверный ответ. Не понимаю, что не так, помогите, пожалуйста
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int x, int y)
{
return x % 10 + x / 10
< y % 10 + y / 10;
}
int main()
{
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a.rbegin(), a.rend(), cmp);
for (int i = 0; i < a.size(); ++i)
cout << a[i] << " ";
return 0;
}
Ответы (1 шт):
Зачем вы вообще считываете числа, а не просто строки? Ну, а главное - числа могут быть и трехзначные, а вы обрабатываете их как сугубо двузначные. Сортировка по условию требуется устойчивая...
Словом, я бы делал так:
struct Item
{
string s;
int sum;
};
int main()
{
vector<Item> v;
int n;
cin >> n;
for(int i = 0; i < n; ++i)
{
Item it;
cin >> it.s;
it.sum = 0;
for(auto c: it.s) it.sum += c-'0';
v.push_back(it);
}
stable_sort(v.begin(),v.end(),
[](const Item&a, const Item&b)
{
return a.sum > b.sum;
});
for(const auto& it: v)
cout << it.s << " ";
}