Perl и большое число

Для расчета nCr [т.е. n ! / ( r ! * ( n-r )! ) ], написанный ниже код.

Перл-код:

($i,$j)=(1000,100);
print fact($i)/(fact($j)*(fact($i-$j)));
sub fact{
    return 1 if $_[0]<=1;
    return $_[0]*fact($_[0]-1);
}

который выдает результат как "-NaN", но,

тот же логический код в python дает правильный результат.

Код Python:

def fact(x):
    if x <= 1:
        return 1
    return x*f(x-1)
v,y = 1000,100
print fact(v)/(fact(y)*fact(v-y))

Пожалуйста, дайте мне знать, какие изменения я должен внести в код Perl, чтобы заставить его работать с большими числами. (А также я пытался использовать "bigint", но не сработало )

Изменить:

Спасибо всем за ответ.

Извините, я пропустил ; и -1.

Я думаю, что bigint зависит от конфигурации машины

http://www.perlmonks.org/?node_id=906757


person karsas    schedule 19.06.2015    source источник
comment
Ваш код не печатает -NaN. Он даже не компилируется   -  person ikegami    schedule 19.06.2015
comment
Ваша рекурсия в Perl выглядит бесконечной; вы забыли вычесть 1 перед рекурсией (если только в вашем коде нет чрезвычайно тонкого способа вычитания 1, который я пропустил).   -  person Jonathan Leffler    schedule 19.06.2015
comment
@ Джонатан Леффлер, да, как я уже сказал, он не опубликовал код, который использовал, и сказал, что все сделал правильно в коде, который использовал. Что мы можем сделать? Проголосовал за закрытие, так как он не продемонстрировал свою проблему.   -  person ikegami    schedule 19.06.2015
comment
@ikegami: поскольку для поверхностной (установленной) проблемы существует разумный дубликат, нам не нужно слишком придираться к деталям того, какой код предоставляется. В других контекстах, где нет хорошего дубликата, закрытие как неясное или по другим связанным причинам может быть более разумным. Если ОП возвращается и жалуется и добавляет свой неработающий код, используя bigint (что бы это ни значило), мы переоцениваем ситуацию.   -  person Jonathan Leffler    schedule 19.06.2015
comment
@ikegami: Так оно и есть; если вы отметите закрытие, и закрытие будет выполнено, вам будет зачислено решение большинства (или решение с золотым значком), даже если вы не согласны. Поднимите его на MSO, если хотите — я не уверен, обсуждалось ли это раньше, но, вероятно, обсуждалось.   -  person Jonathan Leffler    schedule 19.06.2015
comment
Если бы вы делали это вручную, вы бы никогда не вычислили все эти факториалы... вы бы сначала отменили то, что могли, а затем перемножили оставшиеся члены.   -  person Jim Lewis    schedule 19.06.2015


Ответы (2)


Я не знаю, что вы сделали, но use bigint работает нормально

Как сказал ikegami, код, который вы разместили, даже не компилируется, поэтому вы изо всех сил пытаетесь помочь себе.

use strict;
use warnings;

use bigint;

my ($i, $j) = (1000, 100);

no warnings 'recursion';

print fact($i) / ( fact($j) * fact($i-$j) ), "\n";

sub fact{
    $_[0] <= 1 ? 1 : $_[0] * fact($_[0]-1);
}

вывод

63850511926305130236698511142022274281262900693853331776286816221524376994750901948920974351797699894319420811933446197797592213357065053890

И вообще, зачем тебе этот номер?

person Borodin    schedule 19.06.2015

попробуй это я думаю это решит проблему

use bignum;
($i,$j)=(1000,100);
print fact($i)/(fact($j)*(fact($i-$j)));
sub fact{
    return 1 if $_[0]<=1;
    return $_[0]*fact($_[0]-1);
}
person anuj rana    schedule 19.06.2015