Vai*_*hav 22 c++ algorithm factorial
我遇到了以下计算大型因子(数字大到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;
}
Run Code Online (Sandbox Code Playgroud)
jas*_*son 85
注意
n! = 2 * 3 * ... * n
Run Code Online (Sandbox Code Playgroud)
以便
log(n!) = log(2 * 3 * ... * n) = log(2) + log(3) + ... + log(n)
Run Code Online (Sandbox Code Playgroud)
这很重要,因为如果k
是正整数,那么上限log(k)
是基数10表示的位数k
.因此,这些代码行正在计算数字位数n!
.
p = 0.0;
for(j = 2; j <= n; j++)
p += log10(j);
d = (int)p + 1;
Run Code Online (Sandbox Code Playgroud)
然后,这些代码行分配空间来保存以下数字n!
:
a = new unsigned char[d];
for (i = 1; i < d; i++)
a[i] = 0; //initialize
Run Code Online (Sandbox Code Playgroud)
然后我们只做小学 - 学校乘法算法
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);
}
}
Run Code Online (Sandbox Code Playgroud)
外部循环从运行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/*NUMDIGITS*/; i++)
Run Code Online (Sandbox Code Playgroud)
通过
for (i = 0; i < z/*NUMDIGITS*/; i++)
Run Code Online (Sandbox Code Playgroud)
然后我们只打印出数字
for( i = d -1; i >= 0; i--)
cout << (int)a[i];
cout<<"\n";
Run Code Online (Sandbox Code Playgroud)
并释放分配的内存
delete []a;
Run Code Online (Sandbox Code Playgroud)