#include <iostream>
#include <windows.h>
using namespace std;
int lfac(int *a, int n)
{
int sum,sc;
for(int i=0;i<n*1024;i++)
{
a[i]=0;
}
a[0]=1; //最低位设为1
for(i=2;i<=n;i++)
{
sc=0;
for(int j=0;j<n*1024;j++)
{
sum=a[j]*i+sc; //上一次进位值和当前计算结果求和
sc=sum/10; //存放进位数值
a[j]=sum%10; //将余数存入数组
}
}
if(sc>0)
return -1;
else
return 0;
}
void main()
{
int n;
cout<<"输入要求阶乘的数值:";
cin>>n;
if(n<0)
{
cout<<"/a输入数据错";
return;
}
int * lpBase =(int *) VirtualAlloc(NULL, n*10240, MEM_COMMIT, PAGE_READWRITE); // 保留 n*10240 总的地址空间
int * lpPage = (int *)VirtualAlloc (lpBase + 0,n*1024,MEM_COMMIT,PAGE_READWRITE); // 提交n*1024的页地址空间
bool flag=FALSE;
if(lfac(lpPage,n)<0)
cout<<"溢出"<<endl;
else
{
cout<<n<<"!=";
for(int i=n*1024-1;i>=0;i--)
{
if(flag || lpPage[i]>0)
{
flag=TRUE;
cout<<lpPage[i]; //输出
}
}
cout<<endl;
}
VirtualFree((int *)lpPage + 0,n*1024,MEM_DECOMMIT); // 对页地址解除提交内存
VirtualFree(lpBase,n*10240,MEM_RELEASE); // 释放整个范围的地址
}