dimitriy7
BANNED | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору evgennegve Цитата: Это что ещё за чудо? Добавлено: А, нашёл: это "натуральное число, равное сумме всех своих положительных делителей, отличных от самого числа" Хм, в 32-битный целый тип из таких чисел влезают только: 6, 28, 496, 8128, 33550336. Если задействовать 64-битные, то ещё 8589869056, 137438691328, 2305843008139952128. И всё. Вот этим и надо пользоваться -- не проверять перебором числа на "совершенность", а просто взять готовые значения, благо их мало... Добавлено: Цитата: -- вот с ними не совсем понятно, похоже придётся считать по-честному: Допустим, нашли "совершенное число", пусть оно называется S, тогда ближайшее большее число Фибоначчи F можно искать либо так: Код: f1:=0; f2:=1; repeat F:=f1+f2; f1:=f2; f2:=F; until F>S; | ну или не совсем честно, вот так (на больших числах должно работать быстрее, но может врать из-за ошибок округления): Код: F:=S; repeat inc(F); f1:=sqrt(5*F*F+4); f2:=sqrt(5*F*F-4); until (trunc(f1)=f1)or(trunc(f2)=f2); | или даже так (почестнее и поточнее, но сильно сомневаюсь что быстрее первого варианта): Код: n:=trunc(ln(1+S*sqrt(5))/ln(0.5+0.5*sqrt(5))); c1:=0.5+0.5*sqrt(5); c2:=0.5-0.5*sqrt(5); f1:=1; f2:=1; for i:=1 to n-1 do begin f1:=f1*c1; f2:=f2*c2; end; repeat f1:=f1*c1; f2:=f2*c2; F:=trunc((f1-f2)/sqrt(5)+0.0001); until F>S; |
| Всего записей: 2946 | Зарегистр. 09-10-2008 | Отправлено: 14:04 24-07-2012 | Исправлено: dimitriy7, 16:34 24-07-2012 |
|