N阶乘的方法总结

来源:互联网 发布:房产软件 编辑:程序博客网 时间:2024/05/17 15:57

做一下N阶乘的小结:

#include<iostream>#define N 500000using namespace std;//使用long long时候N=21溢出long long fac(long long n){if(1==n)return 1;else return n*fac(n-1);}//当阶乘数N>21的时候,但是这种方法受到VS2008编译器栈空间大小的限制,//VS2008栈空间大小为1M(默认,可以修改),定义数组保存阶乘结果,//sizeof(int)=4,2^21/4=2^19;阶乘结果最大的位数为2^19;//改进的办法:申请动态数组,将结果保存在数组中,数组可以是整型数组和字符数组void fac2(int f[],int n){  int i,j,up,sum;  for(i=2;i<n;++i)  {  up=0;  for(j=0;j<N;++j)  {               sum=f[j]*i+up;  f[j]=sum%10;  up=sum/10;  }  }}//在这N可以设定大于2^19的数,上限为内存的大小.void fac3(char f[],int n){  int i,j,up,sum;  for(i=2;i<n;++i)  {  up=0;  for(j=0;j<N;++j)  {             f[j]=f[j]-'0';          sum=f[j]*i+up;  f[j]=(sum%10)+'0';  up=sum/10;  }  }}int main(){  int n;  int j=0;/*定义整型数组来保存结果  int *f;  f=(int *)malloc(sizeof(int)*N);  for(j=1;j<N;++j)f[j]=0;  f[0]=1;*///定义字符串来保存结果,字符串一个字符占1字节,一个整型占4字节  char *f;  f=(char *)malloc(sizeof(char)*N);  for(j=0;j<N;++j)f[j]='0';  f[0]='1';//注意不能这样初始化空间/*  while(f)  {*f=0;f++; }*/  cin>>n;  fac3(f,n);  for(j=N-1;f[j]=='0';--j);  for(;j>=0;--j)cout<<f[j]-'0';  cout<<endl;  cout<<sizeof(int)<<endl;  cout<<sizeof(char)<<endl;  return 0;}
有没有人没有听说long long型,在VS2008中sizeof(long long)=8,占64位,本例测试了当N=50000,n!=20000!的时候。
原创粉丝点击