這是一道簡單的數學題,求一個數(N)的階乘。但是問題是題中N給的非常大(0<=N<=10000),用for迴圈來做顯然不行了。這裡用數組來對付這些大傢伙。基本思路如下:
1.開闢一個夠大的數組,保證大於1000!所佔的位元,我是以最大情況來估算,即1000個1000相乘,開一百萬吧,反正我們老大(Miyu)說了數組空間爛便宜。
2.然後就是挨個來乘了(說白了,就是類比我們平時的乘法),這裡不要慣性的只要看見某位過10便想著進位,雖然這樣能做,但艱難。可以讓一位存大一點的數值,要知道,對於每一位來說,可以存下一個21億的數字。
3.如果只是乘,不中途處理一次進位的話,那便永遠是在“個位”做乘法了,肯定不行,於是我們每乘2次處理一次進位(理由見代碼注釋),這樣變可解決這個問題了。
代碼如下:
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h> #define MAX 1000000 int N,p,res[MAX+1]; int main(){while(scanf("%d",&N)!=EOF){ p=MAX; //定義P為最高位指標. memset(res,0,sizeof(res)); //初始化數組 res[MAX]=1; //由於是乘法,初始化為 1 ,這樣0!也就為 1 了 for(int i=2;i<=N;++i){ p-=4; //由於 Lvsi 同志覺得做題目應不止滿足於做出 for(int j=MAX;j>=p;--j) //所以改進了一下,由 [MAX->0] 改為每次乘後 res[j]*=i; //開闢四位進位空間,根據乘以最大數10000而來. if(i%2==0||i==N)//讓它乘兩次處理一次進位,即把每位更新成9以下 { //如果%3的話想想連乘 998 999 1000 之類的肯定,溢出了. for(int j=MAX;j>=p;--j) //最後進位是必須的 {int c=res[j]/10;res[j]%=10;res[j-1]+=c;} }}for(int i=0;i<=MAX;++i) //清除前置的零. {if(res[i]!=0){p=i;break;}} for(int i=p;i<=MAX;++i)printf("%d",res[i]);puts("");} //system("pause"); return 0;}
提交用了875MS,努力努力。