大整數問題(hdu1024)
/*
一個大整數的問題。首先想到了字串處理的方法,將乘法換成除法來做;如下程式碼1實現提交後果然超時。後來發現不止如此,還有一些問題處理錯誤.,後來轉換思路終於在程式碼2下AC了此題;
*/
/* 程式碼1*/
1#include<iostream> 2#include<string.h> 3usingnamespace std;
4constint MAX=35665;
5char a[MAX],b[MAX];
6int lena,lenb;
7
8void init(char*n,int&m)
9{
10 int i;
11 for(i=0;i<MAX;i++
12 n[i]='0';
13 n[0]='1';
14 m=1;
15 }16
17void turn(char*n,int m)
18{
19 int i;
20 char tmp;
21 for(i=0;i<m/2;i++)
22 {
23 tmp=n[i];
24 n[i]=n[m-i-1];
25 n[m-i-1]=tmp;
26 }27}28
29void add(char*a,char*b)
30{
31 int i,carry;//儲存進位數32char c;
33 carry=0;
34
35 {
36 c=a[i];
37 a[i]=((carry+(c-'0')+(b[i]-'0'))%10)+'0';
38 carry=(carry+(c-'0')+(b[i]-'0'))/10;
39 }40 if(a[lena]!='0')
41 lena++;
42}43
44void copy(char*a,char*b)
45{
46 int i;
47 for(i=0;i<=lena;i++)
48 b[i]=a[i];
49 lenb=lena;
50}51
52void multiply(
53{
54 int i;
55 for(i=1;i<=n;i++)
56 add(a,b);
57 copy(a,b);
58}59
60int main()
61{
62 int n,k;
63 while(cin>>n)
64 {
65 if(n==0||n==1)
66 {
67 cout<<"1/n";
68 continue;
69 }70 init(a,lena);
71 init(b,lenb);
72 for(k=2;k<=n;k++)
73 {
74 multiply(a,k-1);
75 }76 turn(a,lena);
77 a[lena]='/0';
78 cout<<a<<endl;
79 }80 return0;
81}82
//大整數問題,用整型陣列來存放。為了節約時間,將10進位制乘法轉為10000進位制乘法(關鍵).......
/* 程式碼2*/
1 2#include<iostream> 3usingnamespace std;
4constint M=8915;
5int p[M];
6
7void init()
8{
9 int i;
10 for(i=1;i<M;i++)
11 p[i]=0;
12 p[1]=1;
13 p[0]=1;
14}15
16void multy( int*a,int k)//乘法函式//////////////////
17{
18 int i,carry=0,tmp;//carry:乘法的進位數19for(i=1;i<=a[0]+1;i++)
20 {
21 tmp=a[i]*k+carry;//開始時由於經驗主義錯誤,誤將乘法問題處理成加法問題( tmp=(a[i]+carry)*k)
22 a[i]=tmp%10000;
23 carry=tmp/10000;
24 }25 if(a[a[0]+1]!=0)
26 a[0]++;
27}28
29int main()
30{
31 int i,n,first;
32 while(cin>>n)
33 {
34 init();
35 for(i=2;i<=n;i++)
36 multy(p,i);
37 first=1;
38 for(i=p[0];i>=1;i--)
39 {
40 if(first)//小問題,整型陣列最後一位不超過四位時應忽略前導0
41 {
42 cout<<p[i];
43 first=0;
44 continue;
45 }46 printf("%04d",p[i]); //輸出關鍵,當後面的整型陣列中小於四位時要輸出前導0 ""%04d""是關鍵
47 }48 cout<<endl;
49 }50 return0;
51}