Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在最佳时间内计算一个数的阶乘_Algorithm_Factorial - Fatal编程技术网

Algorithm 在最佳时间内计算一个数的阶乘

Algorithm 在最佳时间内计算一个数的阶乘,algorithm,factorial,Algorithm,Factorial,给我N个数字,我想计算阶乘模m的和 例如 4 100 12 18 2 11 Ans = (12! + 18! +2!+11!)%100 由于1请尝试以下操作: var numbers = [12,18,2,11] function fact(n) { if(n==1) return 1; return n * fact(n-1); } var accumulator = 0 $.each(numbers, function(index, value) { accumulat

给我N个数字,我想计算阶乘模m的和

例如

4 100
12 18 2 11

Ans = (12! + 18! +2!+11!)%100
由于
1请尝试以下操作:

var numbers = [12,18,2,11]

function fact(n) {
  if(n==1) return 1;
 return n * fact(n-1);
}

var accumulator = 0
$.each(numbers, function(index, value) {
    accumulator += fact(value)
})

var answer = accumulator%100

alert(accumulator)
alert(answer)
您可以在此处看到它正在运行:


如果您使用每个操作%m预先计算阶乘,并对大于m的数字使用有关阶乘的注释提示,您将得到如下结果

fact = new int[m];
f = fact[0] = 1;
for(int i = 1; i < m; i++)
{
    f = (f * i) % m;
    fact[i] = f;
}

sum = 0
for each (n in numbers)
{
    if (n < m)
    {
        sum = (sum + fact[n]) % m
    }
}
fact=newint[m];
f=事实[0]=1;
对于(int i=1;i
我不确定这是否是最好的,但它应该在合理的时间内工作


Upd:可以使用以下知识对代码进行优化:如果对于某个数字j,(j!)%m==0,那么对于每一个n>j(n!)%m==0,那么在某些情况下(通常当m不是质数时),没有必要预先计算小于m的所有数字的阶乘,当m'1实际为n时,(n!)%m==0可能是有用的!当n时,模100为0≥ 10.另一个提示:计算10000一点也不难!模p,其中p是大于10000的素数。这并不困难的暗示应该足以让我们了解它是如何完成的。不需要30000位数字。实际上,不需要八位或八位以上的数字。@gnasher729您能举例说明吗
fact = new int[m];
f = fact[0] = 1;
for(int i = 1; i < m; i++)
{
    f = (f * i) % m;
    fact[i] = f;
}

sum = 0
for each (n in numbers)
{
    if (n < m)
    {
        sum = (sum + fact[n]) % m
    }
}