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