Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 27

Программа должна сортировать натуральные числа в массиве по сумме цифр, но сортировка происходит не правильно

01.06.2019, 23:34. Показов 5070. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа должна сортировать натуральные числа в массиве по убыванию суммы цифр десятичной записи числа, но сортировка происходит правильно не всегда. Помогите найти ошибку.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <vector>
#include <ctime>
#include <algorithm>
 
using std::vector;
using std::cout;
using std::cin;
using std::sort;
 
int digit_sum(int x) //определение суммы цифр
{
    int sum = 0;
    while (x != 0)
    {
        sum += x % 10;
        x /= 10;
    }
    return sum;
}
bool foo(int a, int b) //компаратор
{
    return digit_sum(a) > digit_sum(b);
}
 
int main()
{
    int n;
    vector<int> v;
    srand((unsigned)time(0));
    int a = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a;
        v.push_back(a);
    }
 
    sort(v.begin(), v.end(), foo);
 
    for (auto i = v.begin(); i < v.end(); ++i)
        cout << (*i) << " ";
 
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.06.2019, 23:34
Ответы с готовыми решениями:

Найти все четырехзначные натуральные числа, у которых сумма крайних цифр равна сумме средних цифр, а само число делится
Найти все четырехзначные натуральные числа, у которых сумма крайних цифр равна сумме средних цифр, а само число делится на число А. ...

Существуют натуральные числа равные сумме кубов своих цифр. Найдите такие числа в заданном интервале
Существуют натуральные числа равные сумме кубов своих цифр ,например 370 ,33+73+03=370. Найдите такие числа в интервале от «а» до «b».

Найти натуральные числа, равные сумме кубов своих цифр
В одном городе жили любители математики. Даже номера домов этого города были натуральными числами, равными сумме кубов своих цифр....

10
209 / 183 / 114
Регистрация: 15.03.2014
Сообщений: 398
02.06.2019, 01:33
Влад Хорошавин, было бы замечательно если бы Вы привели конкретные примеры ещё, где сортировка происходит неверно. Могу предположить, что Вы имеете ввиду что сортировка происходит неверно если присутствуют отрицательные числа в векторе.

Пример неверной сортировки
Кликните здесь для просмотра всего текста
5
-999
888
9999
-9999
87845768
87845768 9999 888 -999 -9999


Чтобы программа данный вектор целых чисел отсортировала верно можно возврат из функции определения суммы цифр digit_sum() приводить к положительному значению и вместо простого return сделать возврат с условием, а именно return sum < 0 ? -sum : sum;

Пример сортировки после приведения суммы цифр числа к положительному значению
Кликните здесь для просмотра всего текста
5
-999
888
9999
-9999
87845768
87845768 9999 -9999 -999 888


Если сортировка всё ещё неверно происходит - приводите примеры конкретные.

Не по теме:

Если элементы вектора НЕ генерируются ГПСЧ, то не нужно srand((unsigned)time(0)); и #include <ctime>

0
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 27
02.06.2019, 12:04  [ТС]
В задаче сортируются только положительные целые числа. А не правильная сортировка происходит даже с не очень большими:
11 12 13. После сортировки 13 повторяется несколько раз, потом идёт один раз 12. Примерно так: 13 13 13 13 13 13 12.

Добавлено через 3 часа 8 минут
Чтобы программа данный вектор целых чисел отсортировала верно можно возврат из функции определения суммы цифр digit_sum() приводить к положительному значению и вместо простого return сделать возврат с условием, а именно return sum < 0 ? -sum : sum;
Не помогло.
0
209 / 183 / 114
Регистрация: 15.03.2014
Сообщений: 398
02.06.2019, 13:33
Чисто Ваш код взял.
Вот результат работы программы:
Code
1
2
3
3
11 12 13
13 12 11
Не вижу что неправильного тут, ничего не дублируется даже если ввести числа в другом порядке.

Приведите конкретный пример с конкретным вводом и конкретным выводом, как привожу я хотя бы. Ещё лучше скриншоты плюсом добавить. Иначе помочь Вам не представляется возможным так как неизвестно что Вы хотите.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
02.06.2019, 15:57
Цитата Сообщение от BlackSpace Посмотреть сообщение
Могу предположить, что Вы имеете ввиду что сортировка происходит неверно если присутствуют отрицательные числа
при чём здесь отрицательные, если
Цитата Сообщение от Влад Хорошавин Посмотреть сообщение
Программа должна сортировать натуральные числа
0
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 27
02.06.2019, 18:19  [ТС]
Проверка происходит автоматическая, так что я не знаю при каких данных получается не правильный ответ.
Вот условие задания:
Напишите программу, которая сортирует натуральные числа в массиве по убыванию суммы цифр десятичной записи числа. При равенстве сумм цифр числа должны сохранить исходный порядок.

Входные данные
Первая строка содержит размер массива N . Во второй строке через пробел задаются N чисел – элементы массива. Гарантируется, что 0 < N ≤ 10000 .

Выходные данные
Программа должна вывести в одной строке элементы массива, отсортированного в порядке убыванию суммы цифр десятичной записи числа, разделив их пробелами.

Примеры
входные данные
6
9 21 32 55 81 11
выходные данные
55 9 81 32 21 11
0
209 / 183 / 114
Регистрация: 15.03.2014
Сообщений: 398
02.06.2019, 18:50
Yetty, а я на натуральных и проверял, но всё вроде верно сортировалось, потому и написал, что предполагаю, что ТС получал ошибку на отрицательных числах (вдруг натуральные в заголовок темы случайно попали) так как других вариантов не увидел, а разобраться и помочь было желание.
1
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 27
02.06.2019, 20:28  [ТС]
В ответе уточнил, что только натуральные числа. Также мне сказали, что ошибка в том, что при равенстве сумм цифр числа должны сохранить исходный порядок. И сказали, что нужно изменить алгоритм сортировки на более стабильный.
0
209 / 183 / 114
Регистрация: 15.03.2014
Сообщений: 398
03.06.2019, 14:08
Влад Хорошавин, вроде я понял что требуется.
Мы не знаем как именно реализован алгоритм std::sort (Quicksort возможно), но очевидно в нашем случае он не подходит.

Есть деление сортировок по различным параметрам, в том числе существует параметр устойчивость.
Устойчивой сортировкой называют алгоритм, который не меняет последовательность одинаковых элементов.
Следовательно неустойчивый может их менять. Да и Вам верно подсказали про стабильность сортировки.

Одна из устойчивых сортировок - это сортировка вставками.
Именно её я и попытался применить в программе. Сделал без вектора, просто динамический массив.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
using namespace std;
 
unsigned DigitSum( unsigned x ) {
    unsigned sum = 0;
    while ( x != 0 ) {
        sum += x % 10;
        x /= 10;
    }
    return sum;
}
 
bool Comparison( const unsigned a, const unsigned b ) {
    return DigitSum( a ) < DigitSum( b );
}
 
// третий параметр указатель на функцию сравнения для сортировки
void InsertionSort( unsigned long *arr, size_t size, bool (*compareFunc)( const unsigned, const unsigned ) ) {
 
    for ( size_t i = 1; i < size; ++i )
        for ( size_t j = i; j > 0 && Comparison( arr[ j - 1 ], arr[ j ] ); --j )
            swap( arr[ j - 1 ], arr[ j ] );
}
 
int main() {
 
    const size_t maxCount = 10000;
    unsigned long* arr = new unsigned long[ maxCount ];
 
    size_t count = 0;
    cin >> count;
 
    for ( size_t i = 0; i < count; ++i ) {
        cin >> arr[ i ];
    }
 
    // сортируем массив, указывая какая функция для сравнения элементов используется
    InsertionSort( arr, count, Comparison );
 
    for ( size_t i = 0; i < count; ++i )
        cout << arr[ i ] << " ";
 
    delete[] arr;
 
    return 0;
}

Не по теме:

Кликните здесь для просмотра всего текста
в общем, 21 тест прошла программа, 100 баллов набирает, пробуйте изменить программу немного так как я не в курсе есть ли там проверка на "плагиат".

0
0 / 0 / 0
Регистрация: 01.06.2019
Сообщений: 27
03.06.2019, 14:48  [ТС]
Я уже сам разобрался.
0
 Аватар для 7533620
163 / 70 / 39
Регистрация: 28.05.2019
Сообщений: 241
03.06.2019, 14:49
Лучший ответ Сообщение было отмечено Влад Хорошавин как решение

Решение

Цитата Сообщение от Влад Хорошавин Посмотреть сообщение
при равенстве сумм цифр числа должны сохранить исходный порядок
https://en.cppreference.com/w/... table_sort
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.06.2019, 14:49
Помогаю со студенческими работами здесь

Найти натуральные числа которые равны сумме факториалов их цифр
помогите пожалуйста написать программу,которая найдет все натуральные числа,меньше чем MAXINT, такие ,что они равны сумме факториалов...

Найти трехзначные натуральные числа, равные сумме кубов своих цифр
Кому не тяжело, помогите решить задачу, пожалуйста. Найти трехзначные натуральные числа, равные сумме кубов своих цифр.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru