Algorithm 在最佳时间内计算一个数的阶乘
给我N个数字,我想计算阶乘模m的和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
例如
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
}
}