C++的牛来过来分析一下这个算法~~~~!!

来源:百度知道 编辑:UC知道 时间:2024/06/27 16:00:51
C++的牛来过来分析一下这个算法~~~~!!
//计算target的阶乘
long * Array = new long [target*4+2];//+2是为了应付0!
unsigned int Length = 1,i = 0,j = 0;

for (;target*4+2-j;Array[j++]=0); //全部初始化为0

for(i = Array[1] = 1;i <= target;i++) //这个算法其实很多人都知道,我把写法和算法都优化了
{
for(j = 1; Array[j] = Array[j]*i + Array[j-1]/10,Array[j-1] %= 10,j - Length;j++);
{

for(;Array[j] += Array[j-1] / 10,Array[j-1] %= 10,Array[j];Length++,j++); //改进了
}
}

=====================================================================

这是我在网上看到的一个精确求阶乘的算法....
用这个算法计算10000!只要不到3秒,我自己也写了个算法...精确计算10000的阶乘大概要15秒...差距啊....

谁能分析下这个算法,特别是for(j = 1; Array[j] = Array[j]*i + Array[j-1]/10,Array[j-1] %= 10,j - Length;j++); 在for的第二项里出现了个3个逗号表达式,这个执行的顺序是什么??控制这个循环结束的条件有是什么??
我跟2楼想的一样,我也这么修改了,但是答案就不对了....不知道为什么

#include <iostream>
using namespace std;
const int n=10000;
int num[n]={1};//乘法结果表
void multiply(int q)
{
for (int i=0;i<n;i++)num[i]*=q;
for (int i=0;i<n-1;i++)
{
num[i+1]+=num[i]/10000;
num[i]%=10000;
}
}
void output()
{
bool f=0;
for (int i=n-1;i>=0;i--)
{
if (num[i]!=0)
{
if (f)
{
if (num[i]>999)cout<<num[i];
else if (num[i]>99)cout<<'0'<<num[i];
else if (num[i]>9)cout<<'0'<<'0'<<num[i];
else cout<<'0'<<'0'<<'0'<<num[i];
}
else
{
cout<<num[i];
f=true;
}