高精度加减

一、高精度数据的输入、存储

高精度数据往往数据长度比较长,常用字符数组或字符串进行输入,然后转化成int数组进行存储和操作

 1     string sa,sb;
 2     int a[200],b[200];
 3     //先全部置零,以免高位运算错误
 4     memset(a,0,200); 
 5     memset(b,0,200);
 6     int la,lb; //长度,即位数
 7     cin >> sa >> sb;
 8     la = sa.length();
 9     lb = sb.length();
10     int i;
11     //转换成int数组
12     for(i = la;i >0;i --)
13         a[i] = sa[la - i] - '0';
14     for(i = lb;i > 0;i --)
15         b[i] = sb[lb - i] - '0';

 

二、高精度加法

形式和思路类似我们笔算加法的思路,将低位对齐,从低位向高位逐位相加,逢十进一

这就要求我们在存储的时候从低位向高位存储,与平时写数字的次序相反

 1     if(la < lb)
 2     {
 3         int flag = 0; //判断最终位数是原本数据中较长数据的位数还是较长数据位数加一
 4         for(i=1;i <= lb;i ++)
 5         {
 6             b[i] = b[i] + a[i];
 7             if(b[i]/10 != 0)
 8             {
 9                 if(i == lb) flag = 1;
10                 b[i + 1] ++; //进位
11                 b[i] = b[i] % 10;
12             }
13         }
14         if(flag) 
15         {
16             int zeroFlag = 0; //判断是否为零,若为零则直接输出零
17             for(i = lb+1;i > 0;i --)
18             {
19                 if(b[i] != 0)zeroFlag = 1;
20             }
21             if(zeroFlag)
22             {
23                 for(i = lb+1;i > 0;i --)
24                 cout << b[i];
25             }
26             else
27             {
28                 cout << "0";
29             }
30         }
31         else
32         {
33             int zeroFlag = 0;
34             for(i = lb;i > 0;i --)
35             {
36                 if(b[i] != 0)zeroFlag = 1;
37             }
38             if(zeroFlag)
39             {
40                 for(i = lb;i > 0;i --)
41                 cout <<b[i];
42             }
43             else
44             {
45                 cout << "0";
46             }
47         }
48     }
49     else
50     {
51         int flag = 0;
52         for(i=1;i <= la;i ++)
53         {
54             a[i] = a[i] + b[i];
55             if(a[i]/10 != 0)
56             { 
57                 if(i == la) flag = 1;
58                 a[i + 1] ++; //进位
59                 a[i] = a[i] % 10;
60             }
61         }
62         if(flag)
63         {
64             int zeroFlag = 0;
65             for(i = la+1;i > 0;i --)
66             {
67                 if(a[i] != 0)zeroFlag = 1;
68             }
69             if(zeroFlag)
70             {
71                 for(i = la+1;i > 0;i --)
72                 cout << a[i];
73             }
74             else
75             {
76                 cout << "0";
77             }
78         }
79         else
80         {
81             int zeroFlag = 0;
82             for(i = la;i > 0;i --)
83             {
84                 if(a[i] != 0)zeroFlag = 1;
85             }
86             if(zeroFlag)
87             {
88                 for(i = la;i > 0;i --)
89                 cout << a[i];
90             }
91             else
92             {
93                 cout << "0";
94             }
95         }
96     }

 

  三、高精度减法

  思路依然类似笔算减法的思路,这里先判断符号,然后用大数减去小数算出绝对值,再在输出过程中添加符号

  从低位向高位开始减,注意借位即可

 1 int resultCompare = compare(a,b,la,lb); //a,b的比较结果
 2     if(resultCompare == -1) //a,b相等,相减为0
 3     {
 4         cout << "0" <<endl;
 5     }
 6     else if(resultCompare == 1) //a>b,正
 7     {
 8         for(i = 1;i <= la;i ++)
 9         {
10             if(a[i] >= b[i]) a[i] = a[i] - b[i];
11             else
12             {
13                 a[i] = a[i] + 10 - b[i];
14                 //借位
15                 for(j = i;j <= la - 1;j ++)
16                 {
17                     if(a[j+1] >= 1) {a[j+1] --;break;}
18                     else
19                     {
20                         a[j+1] = 9;
21                     }
22                 }
23             }
24         }
25         int zeroFlag = 0;
26         for(i = la;i > 0;i --)
27         {
28             if(!zeroFlag && a[i]!=0)
29             {
30                 zeroFlag = 1;
31             }
32             if(zeroFlag)
33                 cout << a[i];
34         }
35         cout << endl;
36     }
37     else //a<b,负
38     {
39         for(i = 1;i <= lb;i ++)
40         {
41             if(b[i] > a[i]) b[i] = b[i] - a[i];
42             else
43             {
44                 b[i] = b[i] + 10 - a[i];
45                 //借位
46                 for(j = i;j <= lb - 1;j ++)
47                 {
48                     if(b[j+1] >= 1) {b[j+1] --;break;}
49                     else
50                     {
51                         b[j+1] = 9;
52                     }
53                 }
54             }
55         }
56         int zeroFlag = 0;
57         cout << "-";
58         for(i = lb;i > 0;i --)
59         {
60             if(!zeroFlag && b[i]!=0)
61             {
62                 zeroFlag = 1;
63             }
64             if(zeroFlag)
65                 cout << b[i];
66         }
67         cout <<endl;
68     }
69 
70 int compare(int a[],int b[],int la,int lb) //a>b返回1;a<b返回0;a=b返回-1
71 {
72     if(la > lb) return 1;//a>b
73     else if (la < lb) return 0; //a<b
74     else
75     {
76         int i;
77         for(i = la;i > 0;i --)
78             if(a[i] > b[i]) return 1; //a>b
79             else if(a[i] < b[i]) return 0; // a<b
80             else return -1; //二者相等
81     }
82 }

 

posted @ 2018-07-16 11:22  Enid_mew  阅读(111)  评论(0编辑  收藏  举报