1. 程式人生 > >C/C++“大數相加演算法”

C/C++“大數相加演算法”

函式原型介紹:
  1. // first和second:任意大小的十進位制字串整數,該函式主要解決超出int和long值域的大型整數加法運算
  2. // first和second的取值範圍:可以是"99999999999999999"、"-9999999999999999999"和"0"等
  3. // result:儲存相加的結果
  4. void add_large_integer(constchar* first, constchar* second, char* result);  
實現原理介紹:整數相加問題可以歸結為兩個子問題,即”正整數相加和正整數相減“,相加需要考慮進位的情況,相減則考慮借位的情況,按照測試驅動開發的原則,寫上若干測試用例,如下所示:
  1. #include <assert.h>
  2. #include <string>
  3. usingnamespace std;  
  4. int main(int argc, char* argv[])  
  5. {  
  6.     char result[2048] = {0};  
  7.     // 用例1
  8.     add_large_integer("99999999999999999999""99999999999999999999", result);  
  9.     assert(0 == strcmp(result, "199999999999999999998"
    ));  
  10.     // 用例2
  11.     result[0] = '\0';  
  12.     add_large_integer("-99999999999999999999""6666666666666666666666666666666", result);  
  13.     assert(0 == strcmp(result, "6666666666566666666666666666667"));  
  14.     return 0;  
  15. }  
將要用到的輔助函式列表,原型如下:
  1. // 跳過連續無效數字
  2. constchar* skip_serial_number(const
    char* integer, int number);  
  3. // 反轉字串
  4. char* reverse_string(char* p);  
  5. // 判斷是否正整數
  6. bool is_positive_integer(constchar* integer);  
  7. // 判斷是否負整數
  8. bool is_negative_integer(constchar* integer);  
  9. // 正整數相加
  10. void add_positive_integer(constchar* first, constchar* second, char* result);  
  11. // 正整數相減
  12. void minus_positive_integer(constchar* large, constchar* small, char* result);  
函式實現:
  1. // 大數相加演算法
  2. void add_large_integer(constchar* first, constchar* second, char* result)  
  3. {  
  4.     // 資料有效性校驗
  5.     if ( !(is_positive_integer(first) || is_negative_integer(first)) ||  
  6.          !(is_positive_integer(second) || is_negative_integer(second)) )  
  7.     {  
  8.         return;  
  9.     }  
  10.     // 兩個正整數相加
  11.     if ( is_positive_integer(first) && is_positive_integer(second) )  
  12.     {  
  13.         // 跳過無效字元
  14.         first = skip_serial_number(first, '0');  
  15.         second = skip_serial_number(second, '0');  
  16.         // 儲存兩個整數
  17.         string first_number(first ? first : "");  
  18.         string second_number(second ? second : "");  
  19.         // 字串反轉,使得個位對齊
  20.         first = reverse_string((char*)first_number.c_str());  
  21.         second = reverse_string((char*)second_number.c_str());  
  22.         add_positive_integer(first, second, result); // 兩個正整數相加
  23.         reverse_string(result); // 反轉result字串結果
  24.     }  
  25.     // 兩個負整數相加
  26.     elseif ( is_negative_integer(first) && is_negative_integer(second) )  
  27.     {  
  28.         strcpy(result, "-"); // 新增負號
  29.         add_large_integer(++first, ++second, ++result); // 跳過負號,變為正整數相加
  30.     }  
  31.     // 正整數和負整數相加
  32.     else
  33.     {  
  34.         if ( is_negative_integer(first) ) // first為負數,second為正數
  35.         {  
  36.             ++first; // 移除負號;
  37.             // 跳過無效符號
  38.             first = skip_serial_number(first, '0');  
  39.             second = skip_serial_number(second, '0');  
  40.             // 儲存兩個正整數
  41.             string first_number(first ? first : "");  
  42.             string second_number(second ? second : "");  
  43.             // 比較兩個正整數的大小
  44.             int first_len = first ? strlen(first) : 0;  
  45.             int second_len = second ? strlen(second) : 0;  
  46.             int retcode = (first_len > second_len) ? 1 : \  
  47.                 ((first_len < second_len) ? -1 : strcmp(first, second));  
  48.             if ( 0 == retcode )  
  49.             {  
  50.                 strcpy(result, "0"); // 相加和等於零
  51.                 return;  
  52.             }  
  53.             else
  54.             {  
  55.                 // 字串反轉,使得個位對齊
  56.                 first = reverse_string((char*)first_number.c_str());  
  57.                 second = reverse_string((char*)second_number.c_str());  
  58.                 if ( retcode < 0 ) // 負數的絕對值小於正數,相加後為正數
  59.                 {  
  60.                     minus_positive_integer(second, first, result); // 求絕對值的差
  61.                 }  
  62.                 else// 負數的絕對值大於正數,相加後為負數
  63.                 {  
  64.                     strcpy(result, "-"); // 新增負號
  65.                     minus_positive_integer(first, second, ++result); // 求絕對值的差
  66.                 }  
  67.                 reverse_string(result); // 反轉result字串結果
  68.             }  
  69.         }  
  70.         else// first為正數,second為負數
  71.         {  
  72. 相關推薦

    大數相加演算法,基於C++

    自己在做藍橋杯題目是,發現了很多需要大數計算的演算法,查閱相關資料,東西冗雜,決定自己寫演算法。 先做大數相加演算法。 兩個相加的大數的極限就是編譯器字串能接納位數的極限。 採用C++中得string類作為容器。首先準備三個容器,str1與str2接受資料,result接納

    C/C++“大數相加演算法

    函式原型介紹: // first和second:任意大小的十進位制字串整數,該函式主要解決超出int和long值域的大型整數加法運算 // first和second的取值範圍:可以是"99999999999999999"、"-9999999999999

    c/c++實現大數相加相減相乘

    題目描述: 用26個字母實現26進位制數相加,'a'代表0;'z'代表25。 舉例: 輸入: zzz zz 輸出: bazy 程式碼: #include <iostream> #include <string.h> #include <

    c#實現大數相加(字串) string AddBig(string a, string b)

    <pre name="code" class="cpp">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Thr

    C++實現——大數相加

    #include <iostream> #include <string> using namespace std; //大數相加 /** *num1 加數1 *num2

    大數相加演算法實現

    所謂的大數相加就是,數字的長度超出了計算機int64的儲存範圍,需要使用字串儲存進行相加 相加的邏輯,類似與我們小學算加法,列等式進行相加,如果大於等於10則需要進位 下面將用不同語言來實現 Python實現(支援帶小數點大數) #!/usr/bin/env python3 # -*- cod

    C++實現string類型的大數相加(帶小數)

    字符 urn sin 個數 dem 做了 優化 count 變量 近日,做了一道阿裏給的大數相加的編程題。題目大意如下: 輸入兩個string類型的數,如12.223 11,判斷輸入字符串是否合法。合法則輸出true以及相加結果(true 23.223),非法則輸出fal

    C語言實現大數相加(思路+程式碼+執行結果)

    大數相加 思路: 1.先將字串倒序並轉換為數字 2.逐位相加,並存入一個數組e[i]中 3.將得到的結果進行進位處理 4.轉換並把陣列e[i]反轉,迴圈輸出結果 #include<iostrea

    C++大數相加

    主要分為以下幾個步驟: 初始化陣列 -> 輸入字串,並逆序 -> 按位儲存到數組裡 -> 按位相加,並處理進位 -> 判斷最高位是否為0, 並逆序輸出 參考程式碼: #include <iostream> #include &

    資訊學奧賽一本通演算法C++版)基礎演算法:高精度計算 高精度加法(大位相加)

    2018年資訊學奧賽NOIP資料下載 1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 char a1[100],b1[100]; 6 int a[100],b[100],c[100];/

    c語言大數乘法各位相加問題

    #include<stdio.h> #include<string.h> void cal(int n); int main() {char a[100],b[100];int x[100],y[100],c[100],i,j,z,d,k,sum,m,n;scanf("%s",&

    C語言大數相乘問題普通演算法->acm.scu.edu.cn:1002

    問題描述: Calculate A × B Input The input will consist of a series of pairs of integers a and b, separa

    C/C++程式設計小練習 大數乘方(快速冪演算法實現)

    將我之前的大數乘方的演算法做了些小優化,程式碼改動很小 快速冪演算法實現大數乘方,時間複雜度由O(n^3)降到O(n^2*logn) 快速冪演算法原理其實蠻簡單的,類似於二分法的思想,掃描指數n的二進位制形式,然後按照0或1做相應處理 #include <iostre

    C/C++程式設計小練習 大數減法之浮點大數減法演算法

    #include <iostream> #include <cstring> using namespace std; void reverse_str(char *a,int size){ for(int i=0;i<size/2;++i)

    C/C++程式設計小練習 大數加法之浮點大數加法演算法

    #include <iostream> #include <cstring> using namespace std; void reverse_str(char *a,int size){ for(int i=0;i<size/2;++i)

    C/C++大數加法動態分配內存

    動態分配內存 tgz wot jmx nvl style blank .html zax 84運g2ndtj欣窖http://www.zcool.com.cn/collection/ZMTk1MTM1OTI=.html TS凸晃i23時窒貿0http://www.zcoo

    c/c++如何解決PC蛋蛋源碼下載 大數存儲問題(100的階乘)

    stdio.h 語言 例子 字符 使用字符串 ++ c++ 如何 fine PC蛋蛋源碼下載 聯系方式:QQ:2747044651 網址http://zhengtuwl.com 首先在編程中會遇到一些很大的數,由於已經給定的數據類型存儲範圍有限,所以我們應該掌握,如何處理這

    學習筆記-C語言5(演算法設計提高)

    演算法複雜度是指演算法在編寫可執行程式後,執行時所需要的時間資源和記憶體資源。演算法設計一般更在意時間和計算資源的開銷,而對空間資源則不太介意。 1. 二分查詢 二分查詢又稱折半查詢,首先陣列中的元素時按升序排列,將陣列中間位置的關鍵字與查詢關鍵字比較: 1)如果兩者相等,則查詢成功

    安全不安全003:C#實現MD5加密演算法

    MD5是一種資訊-摘要演算法,一種單向函式演算法(也就是HASH演算法)。將不同輸入長度的資訊進行雜湊計算,得到固定長度的輸出。它的主要特點是,不可逆 和唯一性。即不能由結果計算出輸入值;且不同的輸入值計算得到的固定長度輸出是唯一的。 目前使用的面向物件程式語言中,基本都有類庫實現好的MD5方法

    c#程式碼實現排序演算法之歸併排序

    歸併排序的平均時間複雜度為O(nlogn),最好時間複雜度為O(nlogn),最壞時間複雜度為O(nlogn),空間複雜度為O(n),是一種穩定的演算法。 1.將待排序序列r(1),r(2),…,r(n)劃分為兩個長度相等的子序列r(1),…r(n/2)和r(n/2+1),…,r