C/C++“大數相加演算法”
- // first和second:任意大小的十進位制字串整數,該函式主要解決超出int和long值域的大型整數加法運算
- // first和second的取值範圍:可以是"99999999999999999"、"-9999999999999999999"和"0"等
- // result:儲存相加的結果
- void add_large_integer(constchar* first, constchar* second, char* result);
- #include <assert.h>
- #include <string>
- usingnamespace std;
- int main(int argc, char* argv[])
- {
- char result[2048] = {0};
- // 用例1
- add_large_integer("99999999999999999999", "99999999999999999999", result);
-
assert(0 == strcmp(result, "199999999999999999998"
- // 用例2
- result[0] = '\0';
- add_large_integer("-99999999999999999999", "6666666666666666666666666666666", result);
- assert(0 == strcmp(result, "6666666666566666666666666666667"));
- return 0;
- }
- // 跳過連續無效數字
-
constchar* skip_serial_number(const
- // 反轉字串
- char* reverse_string(char* p);
- // 判斷是否正整數
- bool is_positive_integer(constchar* integer);
- // 判斷是否負整數
- bool is_negative_integer(constchar* integer);
- // 正整數相加
- void add_positive_integer(constchar* first, constchar* second, char* result);
- // 正整數相減
- void minus_positive_integer(constchar* large, constchar* small, char* result);
- // 大數相加演算法
- void add_large_integer(constchar* first, constchar* second, char* result)
- {
- // 資料有效性校驗
- if ( !(is_positive_integer(first) || is_negative_integer(first)) ||
- !(is_positive_integer(second) || is_negative_integer(second)) )
- {
- return;
- }
- // 兩個正整數相加
- if ( is_positive_integer(first) && is_positive_integer(second) )
- {
- // 跳過無效字元
- first = skip_serial_number(first, '0');
- second = skip_serial_number(second, '0');
- // 儲存兩個整數
- string first_number(first ? first : "");
- string second_number(second ? second : "");
- // 字串反轉,使得個位對齊
- first = reverse_string((char*)first_number.c_str());
- second = reverse_string((char*)second_number.c_str());
- add_positive_integer(first, second, result); // 兩個正整數相加
- reverse_string(result); // 反轉result字串結果
- }
- // 兩個負整數相加
- elseif ( is_negative_integer(first) && is_negative_integer(second) )
- {
- strcpy(result, "-"); // 新增負號
- add_large_integer(++first, ++second, ++result); // 跳過負號,變為正整數相加
- }
- // 正整數和負整數相加
- else
- {
- if ( is_negative_integer(first) ) // first為負數,second為正數
- {
- ++first; // 移除負號;
- // 跳過無效符號
- first = skip_serial_number(first, '0');
- second = skip_serial_number(second, '0');
- // 儲存兩個正整數
- string first_number(first ? first : "");
- string second_number(second ? second : "");
- // 比較兩個正整數的大小
- int first_len = first ? strlen(first) : 0;
- int second_len = second ? strlen(second) : 0;
- int retcode = (first_len > second_len) ? 1 : \
- ((first_len < second_len) ? -1 : strcmp(first, second));
- if ( 0 == retcode )
- {
- strcpy(result, "0"); // 相加和等於零
- return;
- }
- else
- {
- // 字串反轉,使得個位對齊
- first = reverse_string((char*)first_number.c_str());
- second = reverse_string((char*)second_number.c_str());
- if ( retcode < 0 ) // 負數的絕對值小於正數,相加後為正數
- {
- minus_positive_integer(second, first, result); // 求絕對值的差
- }
- else// 負數的絕對值大於正數,相加後為負數
- {
- strcpy(result, "-"); // 新增負號
- minus_positive_integer(first, second, ++result); // 求絕對值的差
- }
- reverse_string(result); // 反轉result字串結果
- }
- }
- else// first為正數,second為負數
- {
-
相關推薦
大數相加演算法,基於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