gpt4 book ai didi

c++ - 谁能解释这个计算大阶乘的算法?

转载 作者:IT老高 更新时间:2023-10-28 21:37:25 24 4
gpt4 key购买 nike

我遇到了以下计算大阶乘的程序(数字大到 100).. 谁能解释一下这个算法中使用的基本思想?我只需要知道在计算阶乘中实现的数学。

#include <cmath>
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{

unsigned int d;

unsigned char *a;

unsigned int j, n, q, z, t;

int i,arr[101],f;

double p;


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

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

return 0;
}

最佳答案

注意

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

这样

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

这很重要,因为如果 k是一个正整数,那么 log(k) 的上限是 k 的 base-10 表示中的位数.因此,这些代码行正在计算 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/*NUMDIGITS*/; i++) {
t = (a[i] * j) + q;
q = (t / 10);
a[i] = (char)(t % 10);
}
}

外部循环从 j 开始运行来自 2n因为在每一步中,我们都会将 a 中的数字表示的当前结果相乘。由 j .内部循环是小学乘法算法,其中我们将每个数字乘以 j并将结果带入 q如有必要。

p = 0.0在嵌套循环和 p += log10(j) 之前在循环内部,只需跟踪到目前为止答案中的位数。

顺便说一句,我认为这部分程序存在错误。循环条件应为 i < z不是 i <= z否则我们将写到 a 的末尾当z == d这肯定会在 j == n 时发生.因此替换

for (i = 0; i <= z/*NUMDIGITS*/; i++)

通过

for (i = 0; i < z/*NUMDIGITS*/; i++)

然后我们只打印出数字

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

并释放分配的内存

delete []a;

关于c++ - 谁能解释这个计算大阶乘的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2127540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com