日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++求阶乘

發(fā)布時(shí)間:2023/12/18 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++求阶乘 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

1階乘定義

2代碼

2.1for循環(huán)

2.2while循環(huán)

2.3遞歸法

3高精度階乘


1階乘定義

階乘是基斯頓·卡曼(Christian Kramp,1760~1826)于 1808 年發(fā)明的運(yùn)算符號(hào),是數(shù)學(xué)術(shù)語(yǔ)。

一個(gè)正整數(shù)的階乘factorial)是所有小于及等于該數(shù)正整數(shù)的積,并且0的階乘為1。自然數(shù)n的階乘寫作n!。1808年,基斯頓·卡曼引進(jìn)這個(gè)表示法。

亦即n!=1×2×3×...×(n-1)×n。階乘亦可以方式遞歸定義:0!=1,n!=(n-1)!×n。

2代碼

從階乘的定義可以看出來(lái),階乘其實(shí)就是一個(gè)初始數(shù)值為1的變量乘上1~n的所有數(shù),需要注意的是0的情況下要輸出1。

2.1for循環(huán)

#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循環(huán)

#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高精度階乘

不難發(fā)現(xiàn),隨著n的增長(zhǎng),n的階乘呈指數(shù)級(jí)增長(zhǎng),即使使用long long類型,在n=40時(shí),也會(huì)數(shù)據(jù)溢出,為此,引入高精度階乘。

代碼如下

#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; }

但這個(gè)方法太煩了,我自己參照2的n次方,寫了一個(gè)簡(jiǎ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;}

總結(jié)

以上是生活随笔為你收集整理的C++求阶乘的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。