高精度加法(含代碼)

来源:https://www.cnblogs.com/Py-Study0/archive/2023/05/26/High-precision_addition-114514.html
-Advertisement-
Play Games

# 1.初識變數 編程本質就是通過一定的規則,去操縱數據,變數作為數據的載體,在程式中經常會被用到。與變數相聯繫的還有一個名詞叫數據類型,我們可以舉一個生活中的例子,來理解**數據類型-變數-數據**三者之間的關係 ![image](https://img2023.cnblogs.com/blog/ ...


高精度加法

例 1

例如: 1111111111111+9, 列成豎式,

   1 1 1 1 1 1 1 1 1 1 1 1 1
 +                         9
 
 ---------------------------
 

先算個位,

1+9=10,
滿10, 向十位進1

   1 1 1 1 1 1 1 1 1 1 1 1 1
 +                         9
                         1
 ---------------------------
                           0

接下來, 處理進位
十位: 1+1=2 -> 2

   1 1 1 1 1 1 1 1 1 1 1 1 1
 +                         9
                         1
 ---------------------------
                         2 0

百位: 無進位, 直接照抄. 1 -> 1

   1 1 1 1 1 1 1 1 1 1 1 1 1
 +                         9
                         1
 ---------------------------
                       1 2 0

千位: 1 -> 1

萬位: ...

...: ...

最高位: 1 -> 1

最終結果:

   1 1 1 1 1 1 1 1 1 1 1 1 1
 +                         9
                         1
 ---------------------------
   1 1 1 1 1 1 1 1 1 1 1 2 0

所以, 1111111111111+9=1111111111120

例 2

1111111111111+8888888888889,
這個算式變成了高精度+高精度了。

還是列成豎式,

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
 
 ---------------------------
 

先算個位,

1+9=10,
滿10, 向十位進1

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
                         1
 ---------------------------
                           0

接下來, 算十位。

1+8+1=10,
滿10, 向百位進1

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
                       1 1
 ---------------------------
                         0 0

千位, 萬位...以此類推。

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
                     1 1 1
 ---------------------------
                       0 0 0
   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
                   1 1 1 1
 ---------------------------
                     0 0 0 0

......

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
   1 1 1 1 1 1 1 1 1 1 1 1
 ---------------------------
     0 0 0 0 0 0 0 0 0 0 0 0

最高位:
1+8+1=10,
向前一位進1.

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
 1 1 1 1 1 1 1 1 1 1 1 1 1
 ---------------------------
   0 0 0 0 0 0 0 0 0 0 0 0 0
   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
 1 1 1 1 1 1 1 1 1 1 1 1 1
 ---------------------------
 1 0 0 0 0 0 0 0 0 0 0 0 0 0

所以,

1111111111111+8888888888889=10000000000000=1013

   1 1 1 1 1 1 1 1 1 1 1 1 1
 + 8 8 8 8 8 8 8 8 8 8 8 8 9
 1 1 1 1 1 1 1 1 1 1 1 1 1
 ---------------------------
 1 0 0 0 0 0 0 0 0 0 0 0 0 0

代碼

  1. 首先導入頭文件。
// 1. Import libraries
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cstring>
#include <cassert>
#include <vector>
// Import namespace 'std'
using namespace std;
  1. 初始化變數。
// 2. Initialize variables
const int MAX = 1000;
char s[MAX+1];
int a[MAX+1], b[MAX+1],c[MAX+2];
  1. 定義主函數main()
// 3. Define Main Function
int main(int argc, char **argv) {
    for (int i=0;i<1001;i++) {
        s[i]='0';
        a[i]=0, b[i]=0, c[i]=0;
    } // If you use global variables, this initialization does not need used.

這裡如果使用全局變數,這個初始化可以不用。
4. 輸入(包含了處理)變數

    // 4. Input and process variables
    scanf("%s",s+1);
    int lena = strlen(s+1);

    for (int i=1;i<=lena+1;i++)
        a[i] = s[lena-i+1] - '0';

    scanf("%s",s+1);
    int lenb = strlen(s+1);
    for (int i=1;i<=lenb+1;i++)
        b[i] = s[lenb-i+1] - '0';

    int lenc = (lena>lenb)?lena:lenb;
  1. 真正的高精度計算到這裡才開始。計算代碼
    // 5. Calculate
    for (int i=1;i<=101;i++)
        c[i] = 0;
    for (int i=1;i<=lenc;i++) {
        // c[i] = a[i] + b[i]; <-- Wrong! 
        c[i] = a[i] + b[i] + c[i]; // <-- Correct
        // c[i] += a[i] + b[i]; <-- Plan B, Correct too
        // 處理進位
        c[i+1] = c[i] / 10;
        c[i] = c[i] % 10;
    }
    // 處理 overflow
    if (c[lenc+1]>0)
        lenc++;
  1. 輸出
    // 6. Output
    for (int i=lenc;i>=1;i--)
        printf("%d", c[i]);
    return 0;
}

附: 完整代碼

// 1. Import libraries
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <cstring>
#include <cassert>
#include <vector>
// Import namespace 'std'
using namespace std;

// 2. Initialize variables
const int MAX = 1000;
char s[MAX+1];
int a[MAX+1], b[MAX+1],c[MAX+2];


// 3. Define Main Function
int main(int argc, char **argv) {
    for (int i=0;i<1001;i++) {
        s[i]='0';
        a[i]=0, b[i]=0, c[i]=0;
    } // If you use global variables, this initialization does not need used.
	
    // 4. Input and process variables
    scanf("%s",s+1);
    int lena = strlen(s+1);

    for (int i=1;i<=lena+1;i++)
        a[i] = s[lena-i+1] - '0';

    scanf("%s",s+1);
    int lenb = strlen(s+1);
    for (int i=1;i<=lenb+1;i++)
        b[i] = s[lenb-i+1] - '0';

    int lenc = (lena>lenb)?lena:lenb;

    // 5. Calculate
    for (int i=1;i<=101;i++)
        c[i] = 0;
    for (int i=1;i<=lenc;i++) {
        // c[i] = a[i] + b[i]; <-- Wrong! 
        c[i] = a[i] + b[i] + c[i]; // <-- Correct
        // c[i] += a[i] + b[i]; <-- Plan B, Correct too
        // 處理進位
        c[i+1] = c[i] / 10;
        c[i] = c[i] % 10;
    }
    // 處理 overflow
    if (c[lenc+1]>0)
        lenc++;

    // 6. Output
    for (int i=lenc;i>=1;i--)
    printf("%d", c[i]);
    return 0;
}
複製之前看我一下 `Control`, 縮寫為Ctrl, 擴寫為唱,跳,rap,籃球。 你還敢Ctrl+C嗎?

[========]

[========]

[========]

[========]

本文來自博客園,作者:Admin--002,轉載請註明原文鏈接:https://www.cnblogs.com/Py-Study0/p/High-precision_addition-114514.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、小票列印 目前市面上的小票印表機大多採用的列印指令集為ESC/POS指令,它可以使用ASCII碼、十進位、十六進位來控制列印,我們可以使用它來控制字體大小、列印排版、字體加粗、下劃線、走紙、切紙、控制錢箱等,下麵以初始化印表機為例: ...
  • apply(thisArg) apply(thisArg, argsArray) thisArg 在 func 函數運行時使用的 this 值。請註意,this 可能不是該方法看到的實際值:如果這個函數處於非嚴格模式下,則指定為 null 或 undefined 時會自動替換為指向全局對象,原始值會 ...
  • 具體的加密演算法可以可自行查詢其區別,這裡只是拋磚引玉,大部分加密方法基本都能通過改變傳入參數來實現。 C#相關類文檔: System.Security.Cryptography 命名空間 | Microsoft Learn Node JS相關文檔:Crypto | Node.js v16.20.0 ...
  • >我們是[袋鼠雲數棧 UED 團隊](http://ued.dtstack.cn/),致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。。 >本文作者:琉易 [liuxianyu.cn](https://link.juejin.cn/?target=h ...
  • # JavaScript 格式化金額 ## 一、[使用 `Intl.NumberFormat` 構造函數](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberForm ...
  • > 隨著人工智慧技術的不斷發展,阿裡體育等IT大廠,推出的“樂動力”、“天天跳繩”AI運動APP,讓**雲上運動會、線上運動會、健身打卡、AI體育指導**等概念空前火熱。那麼,能否將這些在APP成功應用的場景搬上小程式,分享這些概念的紅利呢?本系列文章就帶您一步一步從零開始開發一個AI運動小程式,本 ...
  • 前端構建的提速是一項比較複雜且細節的工程, 目前產品上在持續跟蹤構建慢的應用, 努力優化編譯速度, 但前端本身擁有一個比較自由的技術環境, 沒有統一的構建工具與流程, 另外語言本身的執行效率、單線程的構建也不好讓編譯機發揮其最大能力, 所以目前全局的通用優化手段還是會比較局限, 還是依賴項目自身的優... ...
  • 如果你有 *n* 個緩存伺服器,一個常見的負載均衡方式是使用以下的哈希方法: *伺服器索引 = 哈希(鍵) % N*,其中 *N* 是伺服器池的大小。 讓我們通過一個例子來說明這是如何工作的。如表5-1所示,我們有4台伺服器和8個字元串鍵及其哈希值。 ![image-2023052022160981 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...