用动态申请虚拟内存求任意数阶乘的C++实现

 

计算较小数的阶乘程序很容易编写,对于较大数的阶乘的计算一般做法是使用数组,但是数组的长度有限,本程序采用动态申请虚拟内存空间的方法,优点是使用的不是物理内存,而是虚拟内存,申请的范围更大。
具体程序如下:

#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);             // 释放整个范围的地址

 

 

推荐网站:好巴鹿(http://www.haobalu.com )
letao
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值