谁能解释这种算法来计算大阶乘?

谁能解释这种算法来计算大阶乘?,第1张

谁能解释这种算法来计算大阶乘?

注意

n! = 2 * 3 * ... * n

以便

log(n!) = log(2 * 3 * ... * n) = log(2) + log(3) + ... + log(n)

这很重要,因为如果

k
是正整数,则的上限
log(k)
是的以10为底的表示形式的位数
k
。因此,这些代码行正在计算中的位数
n!

p = 0.0;for(j = 2; j <= n; j++)    p += log10(j);d = (int)p + 1;

然后,这些代码行分配空间来容纳以下数字

n!

a = new unsigned char[d];for (i = 1; i < d; i++)    a[i] = 0; //initialize

然后我们只做小学乘法

p = 0.0;for (j = 2; j <= n; j++) {    q = 0;    p += log10(j);    z = (int)p + 1;    for (i = 0; i <= z; i++) {        t = (a[i] * j) + q;        q = (t / 10);        a[i] = (char)(t % 10);    }}

外部循环从运行

j
2
n
,因为在我们将乘当前结果中表示由数字的每个步骤
a
通过
j
。内循环是年级乘法算法,其中我们将每个数字乘以
j
并在
q
必要时将结果带入。

p = 0.0
嵌套循环和前
p += log10(j)
内环路只是跟踪的位数的答案为止。

顺便说一句,我认为程序的这一部分存在错误。循环条件应该是

i < z
没有
i <= z
,否则我们会写过去的结束
a
z ==d
,这将是肯定的,当发生
j == n
。因此更换

for (i = 0; i <= z; i++)

通过

for (i = 0; i < z; i++)

然后我们只打印数字

for( i = d -1; i >= 0; i--)    cout << (int)a[i];cout<<"n";

并释放分配的内存

delete []a;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5643276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存