Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Опредилить числа |
Автор: Saninho 4.2.2013, 00:52 |
Всем привет Уважаемые пользователи помогите решить задачу (С + + или Visual C + +) если не трудно. Вот у меня произошла проблема в написать программы: Натуральное число называется совершенным, если оно равно сумме всех своих делителей, за исключением самого себя. Данное натуральное число N. Используя тылькы елементарны арифметичны операцыъ (+, -, *, /) определить все совершенные числа меньше N. Буду очень благодарен. Кто может то посоветуйте учебник чтобы я самостоятельно научился писать программы такого типа. Спасибо за внимание. |
Автор: math64 11.2.2013, 10:19 |
Создать массив int[N+1]; (можно размерности N или N-1 если индексироваться от 1 или 2) Решетом Эратосфена определить простые числа, а для составных - наименьший делитель. А дальше перебирай числа, находи делители и проверяй на совершенность. |
Автор: feodorv 11.2.2013, 19:25 |
Так довольно сложно. Потом придётся перебирать комбинации простых делителей... Из двух делителей, потом из трёх и т.д. Потом тут будет нужен массив, а есть сомнение, что они разрешены: Понятно, что тут чем проще, тем не оптимальнее. И самое простое, но совершенно не оптимальное решение ![]() |
Автор: sQu1rr 11.2.2013, 19:43 |
всех чисел меньших или равным sqrt(n) |
Автор: feodorv 11.2.2013, 21:52 |
Нет, но можно <= n/2 для чётных чисел и <= n/3 для нечётных. Речь ведь идёт о любых делителях, не только простых. |
Автор: Qu1nt 11.2.2013, 22:19 |
feodorv, http://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80_%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D0%B5%D0%B9#cite_note-1. |
Автор: feodorv 12.2.2013, 03:16 |
Qu1nt, http://ru.wikipedia.org/wiki/%D1%EE%E2%E5%F0%F8%E5%ED%ED%EE%E5_%F7%E8%F1%EB%EE ![]() Добавлено через 3 минуты и 7 секунд Я понимаю, о чём идёт речь, но |
Автор: math64 12.2.2013, 13:44 | ||
Можно проверять до квадратного корня, для этого извлечение квадратного корня не нужно:
|
Автор: math64 13.2.2013, 07:43 |
d * d >= N можно заменить на q >= d; переполнение d * d возможно когда N > 0x80000000 (при 32 битном int; при другой разрядности другое число нулей) в связи с этим далее условие q > d эквивалентно q != d |
Автор: feodorv 13.2.2013, 08:46 | ||
Я не спорю. Просто написано вместо q > d... Поскольку d и N - просто int, переполнение возникает уже при N = 0x7ffea811 (46340 * 46340 < 0x80000000u; 46341 * 46341 > 0x80000000u), хотя Я имел в виду, что, на мой взгляд, лучше написать в таком стиле:
|