Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.97.248] |
|
Сообщ.
#1
,
|
|
|
Всем привет!
Есть memo1 и button1. Попробовал вот такое посчитать и "ввести результаты". function factorial(n: int64): int64; begin if n > 1 then factorial := n * factorial(n-1) // функция вызывает сама себя else factorial:= 1; // факториал 1 равен 1 end; function AllPuth(grid_size:int64):Extended; var possible_right_moves:int64; possible_down_moves:int64; all_possible_moves:int64; begin possible_right_moves:=grid_size; possible_down_moves:=grid_size; all_possible_moves:=grid_size*2; result:= (factorial(all_possible_moves) / (factorial(possible_right_moves) * factorial(possible_down_moves))) end; procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for I := 2 to 20 do memo1.Lines.Add(IntToStr(I)+' '+FloatTOStr( AllPuth(I ) ) ) //memo1.Lines.Add( FloatToStrF( AllPuth(I ), ffNumber, 8, 2)) end; Скорее всего и так и есть "Я чего-то не понимаю" Даёт следующие результаты, после 10 (выходит -> "не точное решение") 2 6 3 20 4 70 5 252 6 924 7 3432 8 12870 9 48620 10 184756 11 -784,924840609962 12 -34,1487948447273 13 -0,833832867615695 14 1455,00433013791 15 9,49669148927218 16 -1,70640412583304 17 -0,542800478587961 18 -1,20298327072222 19 -0,551555487897427 20 0,0138221794040326 Вопрос: "Как сделать правильно?", то есть Должно быть: 2 --> 6 3 --> 20 4 --> 70 5 --> 252 6 --> 924 7 --> 3432 8 --> 12870 9 --> 48620 10 --> 184756 11 --> 705432 12 --> 2704156 13 --> 10400600 14 --> 40116600 15 --> 155117520 16 --> 601080390 17 --> 2333606220 18 --> 9075135300 19 --> 35345263800 20 --> 137846528820 Заранее спасибо |
Сообщ.
#2
,
|
|
|
Переведи все на extended, факториал 22, а на 11 шаге ты 11 умнодаешь на 2 и вычисляешь факториал, уже превышает int64 на несколько порядков
|