目录
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;
}