目录
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
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
2.2while循环
#include
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
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
#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=0;i--)
printf("%d",f[i]);
printf("n");
return 0;
}
2.2while循环
#include
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
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高精度阶乘
#includeusing 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#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 =0;i--) printf("%d",f[i]); printf("n"); return 0; }



