1. 程式人生 > >大整數問題(hdu1024)

大整數問題(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
    for(i=0;i<=lena;i++)
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(
char*a,int n)
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}