大家帮我看一下这个c++算法

来源:百度知道 编辑:UC知道 时间:2024/07/02 19:14:46
#include <iostream.h>

void Array_Factorial(unsigned int 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);

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++); //改进了
}

cout<<Array[i=Length]<<(target?".":"");//这种打印格式可以看生成的数有多少位 括号里面的修正了打印0!的小bug
for(;--i;cout<<Array[i]);
cout<<" × 10 ^ "<< Length - 1 <<endl;
//// cout<<endl;
delete []Array;
}

void main()
{
int t=0;
cout<<"这个小程序只能计算<20000的阶乘,请输入你想要计算的阶乘: ";//其实算到20000也可以,计算器验证过
while(cin>>t)
Array_Factorial(t);

看错了。呵呵,用你新发的程序来看,他是精确计算的,的确比较复杂,有时间我也要研究下
================

我自己写了个,没他的简洁,但是应该比他的好懂点
#include<iostream>
using namespace std;

void Accurate_Factorial(int size)
{
if(size==0)
{
cout<<"0"<<"!"<<"的精确值为 "<<1<<endl;
return;
}

int i;
int j;
unsigned int length=1; //保存计算出来的位数
unsigned int temp; //临时保存乘积
unsigned int jtemp; //临时保存j

int *array=new int[4*size]; //保证足够的大小

for(i=0;i<4*size-1;i++)
array[i]=0; //初始化数组全部为0

array[0]=1; //初始化0号位

for(i=1;i<=size;i++) //最外层循环,从1乘到size
{
for(j=length-1;j>=0;j--)//从高位乘到低位
{
temp=i*array[j];
array[j]=0; //取出最高位相乘,并赋值为0
jtemp=j;
while(temp>0) //对乘积进行分解
{
array[jtemp]+=temp%10;
temp=temp/10;

if(array[jtemp]>