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

В последовательности из N целых положительных элементов найти сумму всех недостаточных чисел

28.03.2023, 19:26. Показов 1585. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В последовательности из N целых положительных элементов найти сумму всех
недостаточных чисел. Недостаточное число всегда больше суммы всех своих делителей за
исключением самого числа.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.03.2023, 19:26
Ответы с готовыми решениями:

В последовательности из N целых положительных элементов найти сумму всех недостаточных чисел
В последовательности из N целых положительных элементов найти сумму всех недостаточных чисел. Недостаточное число всегда больше суммы...

В последовательности найти сумму всех недостаточных чисел
В последовательности из N целых положительных элементов найти сумму всех недостаточных чисел. Недостаточное число всегда больше суммы...

Найти сумму всех целых положительных чисел, больших 20, меньших 100 и кратных 3Найти сумму всех целых положительных чисе
Найти сумму всех целых положительных чисел, больших 20, меньших 100 и кратных 3. И выдать всю последовательность чисел кратных трех в ряды...

22
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
28.03.2023, 19:49
Недостаточное число определяется так
C++
1
2
3
4
5
6
7
8
9
10
11
bool Nedo(int n)
{
   int s = 1;
   for (int i=2; i*i<=n; i++) {
     if ( n%i==0) {
       s += i;
       if (i*i < n)
           s+= n/i;
    }
    return (s < n);
}
Дальше все просто.
1
4 / 3 / 1
Регистрация: 31.01.2022
Сообщений: 53
28.03.2023, 19:49
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
#include <iostream>
 
using namespace std;
 
int sum_divisors(int num) {
    int sum = 0;
    for (int i = 1; i < num; i++) {
        if (num % i == 0) {
            sum += i;
        }
    }
    return sum;
}
 
bool is_deficient(int num) {
    return sum_divisors(num) < num;
}
 
int main() {
    const int N = 10;
    int arr[N] = {4, 8, 12, 16, 20, 24, 28, 32, 36, 40};
    int deficient_sum = 0;
    for (int i = 0; i < N; i++) {
        if (is_deficient(arr[i])) {
            deficient_sum += arr[i];
        }
    }
    cout << "The sum of all deficient numbers is: " << deficient_sum << endl;
    return 0;
}
Здесь массив arr размера N заполнен заранее для тестирования программы. В реальной задаче можно использовать любой другой способ заполнения массива. Функция sum_divisors вычисляет сумму всех делителей числа num. Функция is_deficient проверяет, является ли число num недостаточным числом. В главной функции происходит обход всех чисел в массиве, проверка их на недостаточность и добавление недостаточных чисел в общую сумму deficient_sum. Результат выводится на экран.
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
28.03.2023, 19:53
FkLight, это вы все правильно сказали....
Но эффективность нахождения делителей, оставляет желать лучшего
0
Злостный нарушитель
 Аватар для Verevkin
10302 / 5725 / 1268
Регистрация: 12.03.2015
Сообщений: 26,508
28.03.2023, 19:53
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cassert>
using namespace std;
 
// функция вернёт true, если x больше суммы делителей х, кроме х. 
bool check(unsigned x)
{
  assert(x);
  unsigned sum = 1;
  for (auto d = 2; 2 * d <= x; d++)
    if (!(x % d)) sum += d;
  return sum < x;
}
 
#define XMAX 152
 
int main()
{
  for (unsigned x = 1; x != XMAX; x++)
    if (check(x)) cout << x << ' ';
  return 0;
}
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
28.03.2023, 20:00
Цитата Сообщение от Verevkin Посмотреть сообщение
for (auto d = 2; 2 * d <= x; d++)
    if (!(x % d)) sum += d;
Тоже тяжеловато... Но если для новичкаFkLight, это простительно, то для форумчанина с твоим опытом просто безобразно
0
4 / 3 / 1
Регистрация: 31.01.2022
Сообщений: 53
28.03.2023, 20:06
Лучший ответ Сообщение было отмечено PashGun_ как решение

Решение

Я только учусь програмировать на c++, так что где-то могу чуть тупить.

Вот вариант попроще:

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
#include <iostream>
using namespace std;
 
bool is_deficient(int num) {
    int sum = 0;
    for (int i = 1; i < num; i++) {
        if (num % i == 0) {
            sum += i;
        }
    }
    return sum < num;
}
 
int main() {
    int arr[] = {4, 8, 12, 16, 20, 24, 28, 32, 36, 40};
    int sum = 0;
    for (int i = 0; i < 10; i++) {
        if (is_deficient(arr[i])) {
            sum += arr[i];
        }
    }
    cout << "The sum of all deficient numbers is: " << sum << endl;
    return 0;
}
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
28.03.2023, 20:16
Цитата Сообщение от FkLight Посмотреть сообщение
Я только учусь програММировать
Вот и хорошо, учитесь! А мы вам буде помогать по мере сил и возможностей
Надеюсь мои замечания вас ни коем случае не оскорбили и не по покоробили? Я бы этого не хотел.
А не эффективность вашего решения идет не столько от малого опыта в программировании, сколько от не понимания или пренебрежения простыми свойствами чисел
0
4 / 3 / 1
Регистрация: 31.01.2022
Сообщений: 53
28.03.2023, 20:19
Вы мне показали мои ошибки, теперь я буду стараться поменьше их допускать. Наоборот, спасибо вам!
0
Злостный нарушитель
 Аватар для Verevkin
10302 / 5725 / 1268
Регистрация: 12.03.2015
Сообщений: 26,508
28.03.2023, 20:25
Цитата Сообщение от Байт Посмотреть сообщение
Тоже тяжеловато... Но если для новичкаFkLight, это простительно, то для форумчанина с твоим опытом просто безобразно
Отвечу, как форумчанин с большим опытом:

Зато честно.
Не нравится - возьми и исправь.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6183 / 2878 / 1042
Регистрация: 01.06.2021
Сообщений: 10,569
28.03.2023, 20:31
Цитата Сообщение от Байт
i*i<=n;
Правильно ли я понимаю, что в твоём коде в каждой итерации вычисляется квадрат?
Не лучше написать:
int sqr_n = std::sqrt(n);
а потом
...; i <= sqr_n; ...
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
28.03.2023, 21:16
Цитата Сообщение от Royal_X Посмотреть сообщение
Не лучше написать:
int sqr_n = std::sqrt(n);
Понимаешь, не люблю я без большой нужды привлекать функции double при работе с целыми. Хрен их знает, какую они дают погрешность.
1
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
28.03.2023, 21:26
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
// std:c++20
#include <algorithm>
#include <iterator>
#include <numeric>
#include <cstdio>
#include <cstdint>
#include <random>
#include <vector>
#include <ranges>
 
auto isdeficient(uint32_t num) {
  auto sum{0ul};
  for (auto i = 1; i < num; i += 1)
    if (0 == num % i) sum += i;
  return sum < num;
}
 
int main(void) {
  // псевдостучайная последовательность из положительных чисел от 1 до 100
  std::random_device rd;
  std::mt19937 mer{rd()};
  std::uniform_int_distribution<uint32_t> dis(1, 100);
 
  std::vector<uint32_t> v(13);
  std::generate(v.begin(), v.end(), [&dis, &mer](){return dis(mer);});
  for (auto x : v)
    printf("%lu ", x);
  printf("\n");
  // получаем из последовательности недостаточные числа
  auto r = v | std::ranges::views::filter([](uint32_t x){return isdeficient(x);});
  for (auto x : r)
    printf("%lu ", x);
  printf("\n");
  // выводим сумму недостаточных чисел
  printf("%lu\n", std::accumulate(r.begin(), r.end(), 0));
}
0
28.03.2023, 21:27

Не по теме:

Байт, но в данном случае никакой погрешности не будет. Будет преобразование из int в double, потом вычислится квадратный корень, далее снова преобразование из double в int. Это гораздо лучше, чем в каждой итерации вычислять квадрат. Вообще, я ничего против твоего кода не имею и не вижу смысла думать об доп оптимизации, просто увидел, что ты сам чёт начал всех критиковать в этой теме, говорить, что их коды тяжёлые, вот и подумал, что мы ракету в космос запускаем...

0
29.03.2023, 01:54

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
мы ракету в космос запускаем...
Топливо - простые числа, иииууууу )))

0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
29.03.2023, 13:35
Цитата Сообщение от Royal_X Посмотреть сообщение
но в данном случае никакой погрешности не будет
Ну. недоверчивый я! Не знаю я, что внутри этой математики делается! То, что считает она не точно, это из самой природы действительных чисел и ЭВМ следует. И даст ли sqrt(1000000) 1000.0001 или 999.99999 я не знаю! Эксперименты меня не убедят. Знаю твердо, что при приведении к инту округлит вниз. И если уж так хочется, лучше целочисленный корень посчитать половинным делением (вряд ли это дольше, чем sqrt) или вот так
int sqr_n = std::sqrt(n+1);

Но, опять же, на своей недоверчивой позиции я не настаиваю
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6183 / 2878 / 1042
Регистрация: 01.06.2021
Сообщений: 10,569
29.03.2023, 14:15
Цитата Сообщение от Байт Посмотреть сообщение
И даст ли sqrt(1000000) 1000.0001 или 999.99999 я не знаю!
Если квадратный корень из целого числа есть целое число, то, насколько мне известно, sqrt из <cmath> во всех случаях посчитает без погрешности даже без приведения к инту. Но а с приведением к инту вообще не должно быть сомнений. Но а если все-таки есть недоверие, то как вы и написали, существуют методы доп. страховки.
Я тоже не навязываю sqrt никому. Просто зная, что современные процессоры считают квадратный корень нативно и очень быстро (на уровне микроинструкции), мне нравится подход с квадратным корнем, даже если я буду юзать FPU.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
29.03.2023, 14:22
Цитата Сообщение от Royal_X Посмотреть сообщение
мне нравится подход с квадратным корнем,
Цитата Сообщение от Байт Посмотреть сообщение
не люблю я без большой нужды привлекать функции double при работе с целыми
Вот на этом мы и разойдемся, чрезвычайно довольные собой и друг другом.
2
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
29.03.2023, 15:36
Цитата Сообщение от Royal_X Посмотреть сообщение
Но а с приведением к инту вообще не должно быть сомнений.
Вот Байт, верно подметил.
Цитата Сообщение от Байт Посмотреть сообщение
И даст ли sqrt(1000000) 1000.0001 или 999.99999 я не знаю!
Поэтому нужно эту погрешность нигеллировать.
round, или подобными функциями.
И не будет страха, и не будет умножение на каждой итерации.
Как то так, хотя я не силен во всех етих плавающих.
Хоть и стараюсь по мере сил разбираться.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6183 / 2878 / 1042
Регистрация: 01.06.2021
Сообщений: 10,569
29.03.2023, 16:23
Цитата Сообщение от SmallEvil Посмотреть сообщение
Байт, верно подметил
я уже писал
Цитата Сообщение от Royal_X Посмотреть сообщение
Если квадратный корень из целого числа есть целое число, то, насколько мне известно, sqrt из <cmath> во всех случаях посчитает без погрешности даже без приведения к инту. Но а с приведением к инту вообще не должно быть сомнений.
Дополню, что опасаться тем более не стоит, если реализация по IEEE-754, а это проверить можно так:
C++
1
2
3
4
5
6
7
#include <iostream>
#include <limits>
 
int main()
{
    std::cout<< std::numeric_limits<double>::is_iec559;
}
std::sqrt(n) будет без погрешности, если в выражении https://www.cyberforum.ru/cgi-bin/latex.cgi?\sqrt{n}=k k это целое число, а n может быть представлено в double без погрешности.
n = 1000000 в double представляется без погрешности (как и любое целое число):
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    double d = 1000000.;
    std::cout.precision(40);
    std::cout<< d;
}
, а k = 1000 это целое число. Т.е. оба условия выполняются.
Значит std::sqrt(1000000.) выдаст 1000 без погрешности.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Поэтому нужно эту погрешность нигеллировать.
round, или подобными функциями.
Если все равно страшно, то вы правы, никто не мешает перестраховаться. Приведение к инту или явное округление или что-нибудь другое - методов множество. Но не надо, чтобы страх вынудил человека отказаться от sqrt в пользу лишних вычислений на каждой итерации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2023, 16:23
Помогаю со студенческими работами здесь

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

Найти сумму всех недостаточных чисел
Требуется помощь. В последовательности из N целых положительных элементов найти сумму всех недостаточных чисел. Недостаточное число...

напишите программу,которая определяет сумму всех положительных чисел вводимой последовательности из N целых чисел.
help me,please!!!

Даны 20 целых чисел. Получить удвоенную сумму всех положительных членов этой последовательности
Даны 20 целых чисел. Получить удвоенную сумму всех положительных членов этой последовательности. Мой код: n = 20 import random ...

В последовательности из N целых положительных элементов найти сумму
В последовательности из N целых положительных элементов найти сумму всех недостаточных чисел. Недостаточное число всегда больше суммы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru