2016-10-16 1 views
1

Я попытался с помощью функции NCM, чтобы найти все комбинации, но и для больших чисел он неНайти количество возможных триплетов (включая дубликаты) элементов массива в линейном времени?

int fact(int num) 
{ 
    if (num == 1 || num == 0) 
     return 1; 
    return num * fact(num-1); 
} 

int nCm(int num, int base) 
{ 
    int result; 
    return result = fact(num)/(fact(num - base)*fact(base)); 
} 

где base = 3 и Num может быть что угодно, так что при больших пит это не удается. Я не могу использовать библиотеку BigInteger так, пожалуйста, помогите

+1

Вы можете вычислить 'n!/(N-b)!' Без вычисления 'n!'. Кроме того, вы можете вычислять факториалы итеративно, а не рекурсивно. Наконец, если 'num' может быть * anything * (например, число Грэма), вы обречены на провал. – Beta

+0

Если у вас действительно есть, вы можете создать свой собственный тип, имея возможность удерживать номер на сколько байтов вам нужно. Это зависит от вас. –

ответ

1

Если вы считаете, что деление на мгновение, вы увидите, что (n-b)! термин является общим для обоих числитель и знаменатель (т.е. они взаимно сокращаются).

Вам просто нужно думать о n! как:

n * (n-1) * (n-2) * ... * (n-b+1) * (n-b)! 

Теперь вы можете вычислить результат без какого-либо разделения или больших промежуточных значений (которые могут переполнить), и вы также можете сделать это без рекурсии.