Поиск совершенного числа

Совершенное число́ (др.-греч. ἀριθμὸς τέλειος) — натуральное число, равное сумме всех своих собственных делителей (т. е. всех положительных делителей, отличных от самого́ числа). По мере того как натуральные числа возрастают, совершенные числа встречаются всё реже.
1-е совершенное число — 6 имеет следующие собственные делители: 1, 2, 3; их сумма равна 6.
2-е совершенное число — 28 имеет следующие собственные делители: 1, 2, 4, 7, 14; их сумма равна 28.
3-е совершенное число — 496 имеет следующие собственные делители: 1, 2, 4, 8, 16, 31, 62, 124, 248; их сумма равна 496.
4-е совершенное число — 8128 имеет следующие собственные делители: 1, 2, 4, 8, 16, 32, 64, 127, 254, 508, 1016, 2032, 4064; их сумма равна 8128.
ЗАДАЧА: найти пятое совершенное число. (Подсмотрел, что оно 8-значное: 33550336).
Вводим, например, 40000000, первые 4 ищет, 5-ое так и не дождался, проц. работает, загрузка на 30-40% (Core i5/2.8GHz).
Может есть способ оптимизировать и ускорить поиск другими алгоритмами.
Учусь в MS Visual Studio C++ 2013
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 48 49 50 51 52 53 54
#include #include using namespace std; int sum(int a) { int b = 0; for (int i = 1; ia; i++) { if (a%i == 0) b += i; } return b; } void main() { setlocale(LC_ALL, "Russian"); int n; cout <"Введите число: "; cin >> n; if (n == sum(n)) { cout <"Результат работы функции для нахождения суммы делителей числа: " ( n) ; cout <"Число " <" совершенное"; } else { cout <"Число " <" не совершенное" ; cout <"Результат работы функции для нахождения суммы делителей числа: " ( n) ; cout <"=========================================================================" ; cout <"Ищем совершенные число. " ; int sum = 0; for (int i = 1; in; i++) { sum = 0; for (int j = 1; ji / 2 + 1; j++) { if (i%j == 0) sum += j; } if (sum == i) cout <"Cовершенное число № " ; } } system ("pause"); }
Совершенные числа
Число совершенно, если оно равно сумме всех своих делителей, кроме самого себя. Пример: 6 = 1 + 2 + 3. Найдите все совершенные числа от 1 до 10000 и выведите их на экран.
Подсказка: необходимо найти все делители от 1 до тестируемого числа. Делителем числа называется число, которое делит данное без остатка ( a mod b = 0 ).
Алгоритм решения задачи:
- Каждое число от 1 до 1000 поочередно делить на все целые числа от 1 до этого числа. На самом деле достаточно до половины заданного числа.
- Найти сумму всех делителей и сравнить с самим числом. Если сумма и число равны, то последнее является совершенным.
Программа на языке Паскаль:
const N = 10000; var i, j, sum: integer; begin for i := 2 to N do begin sum := 0; for j := 1 to i div 2 do begin if i mod j = 0 then sum := sum + j; end; if sum = i then writeln(i, ' - perfect!'); end; end.
Результат выполнения программы:
6 - perfect! 28 - perfect! 496 - perfect! 8128 - perfect!
Как найти совершенное число в c

Новости:
Если Вы не можете войти на форум, потому что не подходит пароль, его нужно восстановить по указанной там ссылке.
http://seoaction.net/index.php?topic=877
- Seoaction.net — seo и не только. »
- Веб-строительство и веб-дизайн »
- Программирование »
- C, C++, C# (Си, Си плюс, Си флеш) »
- Функция на совершенное число
Страницы: [1] Вниз
Автор Тема: Функция на совершенное число (Прочитано 2321 раз)
0 Пользователей и 1 Гость просматривают эту тему.
Страницы: [1] Вверх
- Seoaction.net — seo и не только. »
- Веб-строительство и веб-дизайн »
- Программирование »
- C, C++, C# (Си, Си плюс, Си флеш) »
- Функция на совершенное число
Быстрый ответ
В быстром ответе можно использовать BB-теги и смайлы.
Размер занимаемой памяти: 2 мегабайта.
Страница сгенерирована за 0.099 секунд. Запросов: 35.
Совершенные числа на C++
Целое число называется совершенным, если его сомножители, включая 1 (но не само число) в сумме дают это число. Например, 6 – это совершенное число, так как 6 = 1 + 2 + 3. Напишите функцию is_perfect, которая определяет, является ли параметр number совершенным числом. Используйте эту функцию в программе, которая определяет и печатает все совершенные числа в диапазоне от 1 до 1000.
#include using namespace std; bool is_perfect(int num) < int sum = 0; //в цикле для полученного функцией аргумента //будем находить его сомножители, путем деления его на все //целые числа в интервале от 1 до самого числа for(int j = 1; j < num; j++) < if(num % j == 0) sum += j; >//если число и сумма его сомножителей равны - значит число совершенное if(sum == num) return true; return false; > int main() < for (int i = 1; i < 1000; ++i) < if (is_perfect(i)) < cout > >

Результат работы программы:
28.06.2019 в 19:47 #5692
1/2 часть цикла функции is_perfect работает впустую.
Из теории чисел известно, что все делители произвольного числа меньше половины этого числа, то есть j Учитывая этот факт, можно переписать is_perfect так:
bool is_perfect(int num) < int sum = 0; for (int j = 1; j > return sum == num; >
29.06.2019 в 06:07 #5693