1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4 char a[36000];
5 void rev()
6 {
7 int len=strlen(a),i;
8 char t;
9 for(i=0;i<len/2;++i)
10 {
11 t=a[i];
12 a[i]=a[len-1-i];
13 a[len-1-i]=t;
14 }
15 }//strrev()貌似不是標(biāo)準(zhǔn)庫(kù)函數(shù),囧
16
17 void multi(int n)
18 {
19 int i,l=strlen(a),m=0,jw=0;
20 rev();
21 char t[36000];
22 for(i=0;i<l;++i)
23 {
24 t[i]=((a[i]-'0')*n+jw)%10+'0';
25 jw=((a[i]-'0')*n+jw)/10;
26 }
27 if(jw>=1000)
28 {
29 t[i]=jw%10+'0';
30 t[i+1]=(jw/10)%10+'0';
31 t[i+2]=(jw/100)%10+'0';
32 t[i+3]=jw/1000+'0';
33 t[i+4]='\0';
34 }
35 else if(jw>=100)
36 {
37 t[i]=jw%10+'0';
38 t[i+1]=(jw/10)%10+'0';
39 t[i+2]=jw/100+'0';
40 t[i+3]='\0';
41 }
42 else if(jw>=10)
43 {
44 t[i]=jw%10+'0';
45 t[i+1]=(jw/10)%10+'0';
46 t[i+2]='\0';
47 }
48 else if(jw)
49 {
50 t[i]=jw+'0';
51 t[i+1]='\0';
52 }
53 else t[i]='\0';
54 strcpy(a,t);
55 rev();
56 }//將字符串乘n,需考慮最后的進(jìn)位的位數(shù)。
57
58 int main()
59 {
60 int n;
61 while(cin>>n)
62 {
63 memset(a,0,36000);
64 a[0]='1';
65 a[1]='\0';
66 for(int i=2;i<=n;++i)multi(i);
67 cout<<a<<endl;
68 }
69 return 0;
70 }
71
由于一直不肯寫(xiě)個(gè)大整數(shù)的類(lèi),又不會(huì)用JAVA,遇到這種題目真是感到很難受。不過(guò)我今天用了一種比較耗時(shí)但確實(shí)思路簡(jiǎn)單的方法過(guò)了這道題。首先,我們必須知道10000!到底有多少位,這樣才好定義合適的數(shù)組。
log10(2)+log(3)+...+log10(10000)=35659.9,所以定義一個(gè)36000的字符數(shù)組就夠了。整個(gè)實(shí)現(xiàn)比較簡(jiǎn)單但是用了2312MS.....應(yīng)該分治之類(lèi)的算法會(huì)好點(diǎn),最快的100MS就過(guò)了。估計(jì)是重復(fù)的反轉(zhuǎn)和復(fù)制耗時(shí)了。
posted on 2010-12-06 18:22
cometrue 閱讀(313)
評(píng)論(0) 編輯 收藏 引用