hdu 1042 N!(大数)
生活随笔
收集整理的這篇文章主要介紹了
hdu 1042 N!(大数)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:求n!(0 ≤ N ≤ 10000)
思路:大數(shù),用數(shù)組存儲(chǔ)
1.首先要考慮數(shù)據(jù)N!的位數(shù),因?yàn)樽畲笫?0000!,可以計(jì)算一下大概是5+9000*4+900*3+90*2+10*1=38865位,(此處沒看懂,怎么求的)
可以開一個(gè)40000的int數(shù)組存放,然后用常規(guī)的方法去計(jì)算
2.但是需要改進(jìn)一下,咱們知道int數(shù)組一個(gè)只存1位太浪費(fèi)了,不如讓它的空間發(fā)揮到極限,數(shù)組一個(gè)元素存一個(gè)不超過10^5的數(shù),
為什么是10^5呢?見代碼中的注釋,改進(jìn)后就一個(gè)元素存5位,這樣開的數(shù)組就可以小5倍了,只需要8000就可以了
代碼1:
?
#include<cstdio> #include<cstring>const int N=40000; int main(){int ans[N];int n,i,j,co,sum;while(~scanf("%d",&n)){memset(ans,0,sizeof(ans));ans[0]=1;for(i=2;i<=n;i++){for(j=0,co=0;j<N;j++){//求階乘sum=ans[j]*i+co;//ans[j]=sum%10;co=sum/10;}}for(i=N-1;ans[i]==0;i--);printf("%d",ans[i]);for(i--;i>=0;i--) printf("%d",ans[i]);printf("\n");}return 0; }?
代碼2:
?
#include<cstdio> #include<cstring>const int N=8000; int main(){int ans[N];int n,i,j,co,sum;while(~scanf("%d",&n)){memset(ans,0,sizeof(ans));ans[0]=1;for(i=2;i<=n;i++){for(j=0,co=0;j<N;j++){//求階乘sum=ans[j]*i+co;//這里的sum決定了10^5,因?yàn)閍ns[j]<10^5,i<10^4,co<10^5,那么sum不會(huì)超出int范圍;如果用10^6,則sum可能溢出。ans[j]=sum%100000;co=sum/100000;}}for(i=N-1;ans[i]==0;i--);printf("%d",ans[i]);for(i--;i>=0;i--) printf("%05d",ans[i]);printf("\n");}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/bofengyu/p/4477368.html
總結(jié)
以上是生活随笔為你收集整理的hdu 1042 N!(大数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 央行“意外“降息 专家称贷款买房者首先受
- 下一篇: 我的第三个jquery插件——promp