注意
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;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)