高精度加減

1、高精度數據的輸入、存儲數組

高精度數據每每數據長度比較長,經常使用字符數組或字符串進行輸入,而後轉化成int數組進行存儲和操做spa

 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';

 

2、高精度加法code

形式和思路相似咱們筆算加法的思路,將低位對齊,從低位向高位逐位相加,逢十進一blog

這就要求咱們在存儲的時候從低位向高位存儲,與平時寫數字的次序相反ci

 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     }

 

  3、高精度減法字符串

  思路依然相似筆算減法的思路,這裏先判斷符號,而後用大數減去小數算出絕對值,再在輸出過程當中添加符號string

  從低位向高位開始減,注意借位便可class

 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 }
相關文章
相關標籤/搜索