用C++實現:高精度加法


問題描述
  輸入兩個整數 ab,輸出這兩個整數的和。 ab都不超過100位。
算法描述
  由於 ab都比較大,所以不能直接使用語言中的標准數據類型來存儲。對於這種問題,一般使用數組來處理。
  定義一個數組 AA[0]用於存儲 a的個位, A[1]用於存儲 a的十位,依此類推。同樣可以用一個數組 B來存儲 b
  計算 c = a + b的時候,首先將 A[0]與 B[0]相加,如果有進位產生,則把進位(即和的十位數)存入 r,把和的個位數存入 C[0],即 C[0]等於( A[0]+ B[0])%10。然后計算 A[1]與 B[1]相加,這時還應將低位進上來的值 r也加起來,即 C[1]應該是 A[1]、 B[1]和 r三個數的和.如果又有進位產生,則仍可將新的進位存入到 r中,和的個位存到 C[1]中。依此類推,即可求出 C的所有位。
  最后將 C輸出即可。
輸入格式
  輸入包括兩行,第一行為一個非負整數 a,第二行為一個非負整數 b。兩個整數都不超過100位,兩數的最高位都不是0。
輸出格式
  輸出一行,表示 a + b的值。
樣例輸入
20100122201001221234567890
2010012220100122
樣例輸出
20100122203011233454668012
 
思路:先用字符串數組輸入,再把字符串轉換成整型數組,用數組模擬每一位的加法運算.
 
 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 int main(void)
 5 {
 6     string str1; //輸入兩個字符串
 7     string str2;
 8     //數組大小決定精度大小
 9     int* arr = new int[101]{ 0 };
10     int* brr = new int[101]{ 0 };
11     cin >> str1 >> str2;
12     int len1 = str1.length();  //取得第一個字符串長度
13     int len2 = str2.length();  //取得第二個字符串長度
14     int len;
15     for (int i = 0; i < len1; i++)    //把第一個字符串中的每一位轉換為整數,存放在數組arr中 
16     {
17         arr[i] = str1[len1 - i - 1] - '0';      //減1一定不要減掉了,因為len1是長度,不減1會造成數組越界
18     }                                           //倒着減的原因是要把字符串中的個位轉換到整型數組的第一個位置上
19     for (int i = 0; i < len2; i++)    //把第二個字符串中的每一位轉換為整數,存放在數組brr中
20     {
21         brr[i] = str2[len2 - i - 1] - '0';
22     }
23     len = (len1 > len2 ? len1 : len2);     //取得最大字符串的長度
24     for (int i = 0; i < len; i++)          //模擬加法運算
25     {
26         arr[i] = arr[i] + brr[i];
27         arr[i + 1] = arr[i + 1] + arr[i] / 10;
28         arr[i] = arr[i] % 10;
29     }
30     while ((arr[len] == 0) && (len > 0))  //把數組中多余的0去掉
31     {
32         len--;
33     }
34     for (int i = len ; i >= 0; i--)         //逆向輸出
35     {
36         cout << arr[i];
37     }
38     return 0;
39 }

注意:

           (1):設置數組的時候還要把數組每一位都初始化為0,不然后面模擬加法運算的時候就會因為數組沒有初始化的問題而出現報錯或亂碼。 

           (2):根據題目要求合理確定數組大小,不要過小也不要過大

           (3):由於整型數組初始化十分不方便,而且也很難做到像字符串那樣輸入,所以先按照字符串輸入,再把字符串轉換成整型數組

           (4):length()函數是取得字符串的有效位數,不包含'\0'

           (5):17行和21行,len1- i - 1的原因是len1是有多少位數字,如果不減1,就會造成數組越界。減i是因為在后面數組模擬加法運算的時候,把數組第一位當成了個位,而在原來字符串里面個位在最后一個位置,所以要減i。

           (6):最后輸出之前一定要把數組里面多余的0過濾掉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM