C++求阶乘

目录

1阶乘定义

2代码

2.1for循环

2.2while循环

2.3递归法

3高精度阶乘


1阶乘定义

阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。

一个正整数的阶乘factorial)是所有小于及等于该数正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。

亦即n!=1×2×3×...×(n-1)×n。阶乘亦可以方式递归定义:0!=1,n!=(n-1)!×n。

2代码

从阶乘的定义可以看出来,阶乘其实就是一个初始数值为1的变量乘上1~n的所有数,需要注意的是0的情况下要输出1。

2.1for循环

#include<bits/stdc++.h>
using namespace std;
inline void read(int &a){a=0; char c;while((c=getchar())<48);do a=a*10+(c^48);while((c=getchar())>47);
}
inline void write(int x) {if(x<0) {x=-x;putchar('-');}if(x>9) write(x/10);putchar(x%10+'0');
}
int main()
{int n,m;read(n);int t=1;if(t<1){write(1);}else{for(int i=1;i<n+1;i++){t*=i;}write(t);}return 0;}

2.2while循环

#include<bits/stdc++.h>
using namespace std;
inline void read(int &a){a=0; char c;while((c=getchar())<48);do a=a*10+(c^48);while((c=getchar())>47);
}
inline void write(int x) {if(x<0) {x=-x;putchar('-');}if(x>9) write(x/10);putchar(x%10+'0');
}
int main()
{int n,m;read(n);int t=1;if(t<1){write(1);}else{int f=1;while(f<=n){t*=f;f++;}write(t);}return 0;}

2.3递归法

#include<bits/stdc++.h>
using namespace std;
inline void read(int &a){a=0; char c;while((c=getchar())<48);do a=a*10+(c^48);while((c=getchar())>47);
}
inline void write(int x) {if(x<0) {x=-x;putchar('-');}if(x>9) write(x/10);putchar(x%10+'0');
}
int main()
{int n,m;read(n);int t=1;if(t<1){write(1);}else{int f=1;while(f<=n){t*=f;f++;}write(t);}return 0;}

3高精度阶乘

不难发现,随着n的增长,n的阶乘呈指数级增长,即使使用long long类型,在n=40时,也会数据溢出,为此,引入高精度阶乘。

代码如下

#include<bits/stdc++.h>
#define N 5000
int f[N];
int main()
{int n,x,s=0,i,j;scanf("%d",&n);for(i=2,f[0]=1;i<=n;i++){for(j=x=0;j<N;j++){s=f[j]*i+x;f[j]=s%10;x=s/10;}}for(i=N-1;f[i]==0;i--);for(;i>=0;i--)printf("%d",f[i]);printf("\n");return 0;
}

但这个方法太烦了,我自己参照2的n次方,写了一个简单的

#include<cmath>
#include<iostream>
using namespace std;
int a[10005];
int main()
{a[1]=1;int l=1,s,n;cin>>n;for(int k=1;k<=n;k++){for(int i=1;i<=l;i++){a[i]*=k;}for(int i=1;i<=l;i++){s=0;if(a[i]>9){a[i+1]+=a[i]/10;a[i]%=10;l=max(l,i+1);}}l=max(s,l);}for(int i=l;i>=1;i--){cout<<a[i];}return 0;}

本文链接:https://my.lmcjl.com/post/5781.html

展开阅读全文

4 评论

留下您的评论.