C++求阶乘
目錄
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é)
- 上一篇: android su程序分析
- 下一篇: s3c2440移植MQTT