高精度运算

Posted 远见望远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度运算相关的知识,希望对你有一定的参考价值。

一、高精度加法

  高精度加法是模拟竖式运算得来,总结如下:

  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 }

以上是关于高精度运算的主要内容,如果未能解决你的问题,请参考以下文章

大数高精度运算(模板)

从零开始的算法学习生活——①高精度运算

从零开始的算法学习生活——①高精度运算

PHP 精度计算引发的灾难性Bug

大数运算(加减乘除)

高精度运算