1. 程式人生 > >高精度運算

高精度運算

pan 記錄 預處理 加法 字符 addition multi multipl 進制

一、高精度加法

  高精度加法是模擬豎式運算得來,總結如下:

  1.對字符串進行預處理

  2.兩個數組對應位置分別相加

  3.從低位到高位掃描一遍,超過進制的向上進位

  4.如果最高位大於進制,則向上進位

 1 string s1,s2;
 2 int a[10001],b[10001],c[10001]={};
 3 int la,lb,lc;
 4 void high_precision_addition()
 5 {
 6     if(s1<s2)
 7     {
 8         swap(s1,s2);
 9     }
10     la=s1.length();
11     lb=s2.length();
12 for(int i=0;i<la;i++) 13 { 14 a[la-i]=s1[i]-0; 15 } 16 for(int i=0;i<lb;i++) 17 { 18 b[lb-i]=s2[i]-0; 19 } 20 lc=la; 21 for(int i=1;i<=lb;i++) 22 { 23 c[i]=a[i]+b[i]; 24 } 25 for(int i=lb+1;i<=la;i++) 26 { 27 c[i]=a[i];
28 } 29 for(int i=1;i<lc;i++) 30 { 31 if(c[i]>=10) 32 { 33 c[i+1]+=c[i]/10; 34 c[i]%=10; 35 } 36 } 37 while(c[lc]>=10) 38 { 39 lc+=1; 40 c[lc]=c[lc-1]/10; 41 c[lc-1]%=10; 42 } 43 return; 44 }

二、高精度減法

  1.對字符串進行預處理,判斷正負,記錄正負號,調整被減數和減數,使得被減數不小於減數

  2.對應位置分別相減

  3.從低位到高位掃描,小於0的向上一位借1

  4.如果最高位是0,減小結果長度lc

 1 string s1,s2;
 2 bool negative;
 3 int a[10001],b[10001],c[10001]={};
 4 int la,lb,lc;
 5 void high_precision_subtraction()
 6 {
 7     negative=false;
 8     if(s1.length()<s2.length())
 9     {
10         swap(s1,s2);
11         negative=true;
12     }
13     if(s1.length()==s2.length())
14     {
15         if(s1<s2)
16         {
17             swap(s1,s2);
18             negative=true;
19         }
20     }
21     la=s1.length();
22     lb=s2.length();
23     lc=la;
24     for(int i=0;i<la;i++)
25     {
26         a[la-i]=s1[i]-0;
27     }
28     for(int i=0;i<lb;i++)
29     {
30         b[lb-i]=s2[i]-0;
31     }
32     for(int i=1;i<=lb;i++)
33     {
34         c[i]=a[i]-b[i];
35     }
36     for(int i=lb+1;i<=la;i++)
37     {
38         c[i]=a[i];
39     }
40     for(int i=1;i<lc;i++)
41     {
42         while(c[i]<0)
43         {
44             c[i+1]-=1;
45             c[i]+=10;
46         }
47     }
48     while(c[lc]==0&&lc>0)
49     {
50         lc-=1;
51     }
52     if(lc==0)
53     {
54         lc=1;
55     }
56     return;
57 }

三、高精度乘法

 1 string s1,s2;
 2 int a[10001],b[10001],c[10001]={};
 3 int la,lb,lc;
 4 void high_precision_multiplication()
 5 {
 6     if(s1<s2)
 7     {
 8         swap(s1,s2);
 9     }
10     la=s1.length();
11     lb=s2.length();
12     for(int i=0;i<la;i++)
13     {
14         a[la-i]=s1[i]-0;
15     }
16     for(int i=0;i<lb;i++)
17     {
18         b[lb-i]=s2[i]-0;
19     }
20     lc=la+lb-1;
21     for(int i=1;i<=lb;i++)
22     {
23         for(int j=0;j<la;j++)
24         {
25             c[i+j]+=a[j+1]*b[i];
26         }
27     }
28     for(int i=1;i<lc;i++)
29     {
30         if(c[i]>=10)
31         {
32             c[i+1]+=c[i]/10;
33             c[i]%=10;
34         }
35     }
36     while(c[lc]>=10)
37     {
38         lc++;
39         c[lc]=c[lc-1]/10;
40         c[lc-1]%=10;
41     }
42     return;
43 }

四、高精度除法

 1 string s1,s2;
 2 int a[10001],b[10001],c[10001]={};
 3 int la,lb,lc;
 4 long long division;
 5 void subtraction()
 6 {
 7     for(int i=1;i<=lb;i++)
 8     {
 9         c[i]=a[i]-b[i];
10     }
11     for(int i=lb+1;i<=la;i++)
12     {
13         c[i]=a[i];
14     }
15     for(int i=1;i<lc;i++)
16     {
17         while(c[i]<0)
18         {
19             c[i+1]-=1;
20             c[i]+=10;
21         }
22     }
23     while(c[lc]==0&&lc>0)
24     {
25         lc-=1;
26     }
27     if(lc==0)
28     {
29         lc=1;
30     }
31     return;
32 }
33 void high_precision_division()
34 {
35     if(s1.length()<s2.length())
36     {
37         lc=1;
38         return;
39     }
40     if(s1.length()==s2.length()&&s1<s2)
41     {
42         lc=1;
43         return;
44     }
45     la=s1.length();
46     lb=s2.length();
47     lc=la;
48     for(int i=0;i<la;i++)
49     {
50         a[la-i]=s1[i]-0;
51     }
52     for(int i=0;i<lb;i++)
53     {
54         b[lb-i]=s2[i]-0;
55     }
56     division=0;
57     while(true)
58     {
59         subtraction();
60         division+=1;
61         for(int i=1;i<=lc;i++)
62         {
63             a[i]=c[i];
64             c[i]=0;
65         }
66         la=lc;
67         if(la<lb)
68         {
69             break;
70         }
71         if(la==lb)
72         {
73             int tmpa=la,tmpb=lb;
74             bool flag=false;
75             while(tmpa>=1&&tmpb>=1)
76             {
77                 if(a[tmpa]<b[tmpb])
78                 {
79                     flag=true;
80                     break;
81                 }
82                 tmpa-=1;
83                 tmpb-=1;
84             }
85             if(flag)
86             {
87                 break;
88             }
89         }
90     }
91     return;
92 }

五、高精度取余

 1 string s1,s2;
 2 int a[10001],b[10001],c[10001]={};
 3 int la,lb,lc;
 4 void subtraction()
 5 {
 6     for(int i=1;i<=lb;i++)
 7     {
 8         c[i]=a[i]-b[i];
 9     }
10     for(int i=lb+1;i<=la;i++)
11     {
12         c[i]=a[i];
13     }
14     for(int i=1;i<lc;i++)
15     {
16         while(c[i]<0)
17         {
18             c[i+1]-=1;
19             c[i]+=10;
20         }
21     }
22     while(c[lc]==0&&lc>0)
23     {
24         lc-=1;
25     }
26     if(lc==0)
27     {
28         lc=1;
29     }
30     return;
31 }
32 void high_precision_redundancy()
33 {
34     la=s1.length();
35     lb=s2.length();
36     lc=la;
37     for(int i=0;i<la;i++)
38     {
39         a[la-i]=s1[i]-0;
40     }
41     for(int i=0;i<lb;i++)
42     {
43         b[lb-i]=s2[i]-0;
44     }
45     if(s1.length()<s2.length())
46     {
47         for(int i=1;i<=la;i++)
48         {
49             c[i]=a[i];
50         }
51         return;
52     }
53     if(s1.length()==s2.length()&&s1<s2)
54     {
55         for(int i=1;i<=la;i++)
56         {
57             c[i]=a[i];
58         }
59         return;
60     }
61     while(true)
62     {
63         subtraction();
64         for(int i=1;i<=lc;i++)
65         {
66             a[i]=c[i];
67             c[i]=0;
68         }
69         la=lc;
70         if(la<lb)
71         {
72             break;
73         }
74         if(la==lb)
75         {
76             int tmpa=la,tmpb=lb;
77             bool flag=false;
78             while(tmpa>=1&&tmpb>=1)
79             {
80                 if(a[tmpa]<b[tmpb])
81                 {
82                     flag=true;
83                     break;
84                 }
85                 tmpa-=1;
86                 tmpb-=1;
87             }
88             if(flag)
89             {
90                 break;
91             }
92         }
93     }
94     return;
95 }

高精度運算