Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опредилить числа, Задачка 
V
    Опции темы
Saninho
  Дата 4.2.2013, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.2.2013

Репутация: нет
Всего: нет



Всем привет   Уважаемые пользователи помогите решить задачу (С + + или Visual C + +) если не трудно. Вот у меня произошла проблема в написать программы:    
 Натуральное число называется совершенным, если оно равно сумме всех своих делителей, за исключением самого себя. Данное натуральное число N. Используя тылькы елементарны арифметичны операцыъ (+, -, *, /) определить все совершенные числа меньше N.   
  Буду очень благодарен. 
  Кто может то посоветуйте учебник чтобы я самостоятельно научился писать программы такого типа.   Спасибо за внимание.

Это сообщение отредактировал(а) Saninho - 4.2.2013, 00:52
PM MAIL   Вверх
math64
Дата 11.2.2013, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Создать массив int[N+1]; (можно размерности N или N-1 если индексироваться от 1 или 2)
Решетом Эратосфена определить простые числа, а для составных - наименьший делитель.
А дальше перебирай числа, находи делители и проверяй на совершенность.
PM   Вверх
feodorv
Дата 11.2.2013, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(math64 @  11.2.2013,  11:19 Найти цитируемый пост)
Решетом Эратосфена

Так довольно сложно. Потом придётся перебирать комбинации простых делителей... Из двух делителей, потом из трёх и т.д. Потом тут будет нужен массив, а есть сомнение, что они разрешены:
Цитата(Saninho @  4.2.2013,  01:52 Найти цитируемый пост)
Используя тылькы елементарны арифметичны операцыъ (+, -, *, /) 


Понятно, что тут чем проще, тем не оптимальнее. И самое простое, но совершенно не оптимальное решение  smile  задачи, является ли число n совершенным, заключается в переборе всех чисел, меньших n. Если n делится на такое число без остатка, то его можно добавить в сумму делителей. А после перебора проверить, совпадает ли сумма с самим числом n. Если да, то n - число совершенное. Ну и поверх всего этого сделать цикл по числам n от 1 до N.


Это сообщение отредактировал(а) feodorv - 11.2.2013, 19:32


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
sQu1rr
Дата 11.2.2013, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(feodorv @  11.2.2013,  19:25 Найти цитируемый пост)
заключается в переборе всех чисел, меньших n

всех чисел меньших или равным sqrt(n)
PM MAIL Skype GTalk   Вверх
feodorv
Дата 11.2.2013, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(sQu1rr @  11.2.2013,  20:43 Найти цитируемый пост)
всех чисел меньших или равным sqrt(n) 

Нет, но можно <= n/2 для чётных чисел и <= n/3 для нечётных. Речь ведь идёт о любых делителях, не только простых.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Qu1nt
Дата 11.2.2013, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 1
Всего: 50



feodorv,
Пыц.
PM MAIL   Вверх
feodorv
Дата 12.2.2013, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Qu1nt
Тыч smile

Добавлено через 3 минуты и 7 секунд
Я понимаю, о чём идёт речь, но 
Цитата(Saninho @  4.2.2013,  01:52 Найти цитируемый пост)
Используя тылькы елементарны арифметичны операцыъ (+, -, *, /) 




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
math64
Дата 12.2.2013, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Можно проверять до квадратного корня, для этого извлечение квадратного корня не нужно:
Код

bool isPerfect(int N) {
 int S = 1; // 1 всегда делитель
 for(int d = 2; d * d <= N; ++d) {
   int q = N / d;
   int r = N % d; 
   // r = N - q * d; // если % запрещен
   if (r == 0) {
     S += d;
     if (q > N)
       S += q;
   }
   if (S > N)
     return false;
 }
 return N == S;
}


Это сообщение отредактировал(а) math64 - 12.2.2013, 13:47
PM   Вверх
feodorv
Дата 12.2.2013, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(math64 @  12.2.2013,  14:44 Найти цитируемый пост)
Можно проверять до квадратного корня, для этого извлечение квадратного корня не нужно:

Можно)))) Но тогда нужно быть осторожнее:
Цитата(math64 @  12.2.2013,  14:44 Найти цитируемый пост)
 for(int d = 2; d * d <= N; ++d) {

Здесь d*d опасная конструкция с точки зрения переполнения, хотя, конечно, по заданию вряд ли N дадут достаточно большим....
Цитата(math64 @  12.2.2013,  14:44 Найти цитируемый пост)
     if (q > N)
       S += q;

Наверное, имелось в виду 
Код

if( q != d ) S += q;


math64, хороший вариант оптимизации, однако до всякой оптимизации:
Цитата(Saninho @  4.2.2013,  01:52 Найти цитируемый пост)
посоветуйте учебник чтобы я самостоятельно научился писать программы такого типа
...



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
math64
Дата 13.2.2013, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



d * d >= N можно заменить на q >= d; переполнение d * d возможно когда N > 0x80000000 (при 32 битном int; при другой разрядности другое число нулей)
в связи с этим далее условие q > d эквивалентно q != d

Это сообщение отредактировал(а) math64 - 13.2.2013, 07:45
PM   Вверх
feodorv
Дата 13.2.2013, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(math64 @  13.2.2013,  08:43 Найти цитируемый пост)
в связи с этим далее условие q > d эквивалентно q != d

Я не спорю. Просто написано
Цитата(math64 @  12.2.2013,  14:44 Найти цитируемый пост)
     if (q > N)

вместо q > d...


Цитата(math64 @  13.2.2013,  08:43 Найти цитируемый пост)
переполнение d * d возможно когда N > 0x80000000

Поскольку d и N - просто int, переполнение возникает уже при N = 0x7ffea811 (46340 * 46340 < 0x80000000u; 46341 * 46341 > 0x80000000u), хотя
Цитата(feodorv @  12.2.2013,  16:29 Найти цитируемый пост)
по заданию вряд ли N дадут достаточно большим


Я имел в виду, что, на мой взгляд, лучше написать в таком стиле:
Код
 for(int d = 2; d <= N/d; ++d) 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1132 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.