日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

高精度加法(C++实现)

發布時間:2025/3/21 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高精度加法(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++实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。