栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

注意

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;


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/637451.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号