高精度加法(C++实现)
生活随笔
收集整理的這篇文章主要介紹了
高精度加法(C++实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
高精度加法
簡介
用于計算含有超過一般變量存放不下的非負整數
高精度加法這個過程是模擬的小學豎式加法計算
步驟
以下有順序之分
- 數組清零
- 輸入
- 獲取長度
- 逆置
- 字符型數字轉成對應的整型數字
- 計算并輸出
簡單來看重要的步驟也就以下幾步
- 清零
- 逆置
- 轉換
- 相加計算(包含進位)
代碼實現
逆置
因為數組存放的元素順序與我們計算的順序是相反的,在豎式計算中我們是將其右對齊(個位對個位,十位對十位,以此類推),而讀取數字后的兩個數組是左對齊的,因此我們要將里面的元素逆置
//參數:需要逆置的數組,數組長度 void invertElem(char s[], unsigned long n) {unsigned long len = n - 1;for (int i = 0, j = len; i < j; i++, j--){char temp = s[i];s[i] = s[j];s[j] = temp;}}轉換
為了方便計算和進位,我們需要將字符型的數字轉化成實際數字
注意:這里的轉換不是類型轉換,例如字符類型8,我們要讓它自減48,轉化成ASCII碼為8的對應的字符,存放元素的數組的類型并沒有改變
轉換必須在逆置之后。如果轉換在前逆置在后,則逆置時分不清末尾的0是數字的一部分還是結束符轉換后的數字
//參數:數組,長度 void charInt(char s[], unsigned long n) {for (int i = 0; i < n; i++)s[i] -= 48; }相加
有了以上兩個函數之后,我們就可以進行相加了,這里不多說,分析都在注釋里,所以直接上代碼
int main() {while (1){char a[1024];char b[1024];char c[2049];//這里必須將每一個元素都置為0,否則位數不同的數字相加時會亂掉memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));scanf("%s", a);scanf("%s", b);//長度獲取要在轉換之前unsigned long len_a = strlen(a);unsigned long len_b = strlen(b);unsigned long max_len = len_a > len_b ? len_a : len_b;//逆置invertElem(a, len_a);invertElem(b, len_b);//轉換charInt(a, len_a);charInt(b, len_b);int carry = 0; //進位//相加,核心步驟//這里的i必須能取到max_len,最高位計算式可能會向前進一位//比如99+1,原本最多兩位,相加后得到了一個三位數for (int i = 0; i <= max_len; i++){c[i] = (carry + a[i] + b[i]) % 10;carry = (carry + a[i] + b[i]) / 10;}int i;//尋找第一個不為0的數字或全是0的情況況下找到最后一個0//這是為了防止00+0之類的特殊情況,在這種情況發生時確保只輸出一個0for (i = max_len; i >= 1 && c[i] == 0; i--);for (; i >= 0; i--)printf("%d", c[i]);printf("\n");}return 0; }完整代碼
#include <iostream> #include <string.h> #include <math.h>using namespace std; //參數:需要逆置的數組,數組長度 void invertElem(char s[], unsigned long n) {unsigned long len = n - 1;for (int i = 0, j = len; i < j; i++, j--){char temp = s[i];s[i] = s[j];s[j] = temp;}}void charInt(char s[], unsigned long n) {for (int i = 0; i < n; i++)s[i] -= 48; }int main() {while (1){char a[1024];char b[1024];char c[2049];//這里必須將每一個元素都置為0,否則位數不同的數字相加時會亂掉memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));scanf("%s", a);scanf("%s", b);//長度獲取要在轉換之前unsigned long len_a = strlen(a);unsigned long len_b = strlen(b);unsigned long max_len = len_a > len_b ? len_a : len_b;//逆置invertElem(a, len_a);invertElem(b, len_b);//轉換charInt(a, len_a);charInt(b, len_b);int carry = 0; //進位//相加,核心步驟//這里的i必須能取到max_len,最高位計算式可能會向前進一位//比如99+1,原本最多兩位,相加后得到了一個三位數for (int i = 0; i <= max_len; i++){c[i] = (carry + a[i] + b[i]) % 10;carry = (carry + a[i] + b[i]) / 10;}int i;//尋找第一個不為0的數字或全是0的情況況下找到最后一個0//這是為了防止00+0之類的特殊情況,在這種情況發生時確保只輸出一個0for (i = max_len; i >= 1 && c[i] == 0; i--);for (; i >= 0; i--)printf("%d", c[i]);printf("\n");}return 0; }總結
以上是生活随笔為你收集整理的高精度加法(C++实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快速幂及其模
- 下一篇: 高精度减法(C++实现)