大數相加演算法,基於C++
阿新 • • 發佈:2019-02-05
自己在做藍橋杯題目是,發現了很多需要大數計算的演算法,查閱相關資料,東西冗雜,決定自己寫演算法。
先做大數相加演算法。
兩個相加的大數的極限就是編譯器字串能接納位數的極限。
採用C++中得string類作為容器。首先準備三個容器,str1與str2接受資料,result接納相加結果,原理就是模擬加法的手工計算,先從低位開始相加,若超過10則進1。
其中有很多細節性問題,我列舉一下:
- 1、str1要作為位數最長的一個,方便計算,因此要首先確保str1位數最長,可以通過兩數交換實現。
- 2、result初始狀態的長度要與str1相同,但是在運算過程中可能發生兩數相加,結果長度超過了其中最長的一位,比如900+300,很顯然,結果是4位,這種結果的出現只可能是兩個位數相同的數相加才可能發生,而且最多超出1位。因此我們必須考慮到這種情況,解決辦法如果是我們發現了最高位需要進位,則令result = ‘1’+ result;將1放在首位就解決了。另外在最後輸出我們的字串的長度為length + 1,因為我們可能最高位進位了,長度+1,就算沒有進位,也沒有關係,我們將輸出一個\0,也就是空字元。
下面是程式碼,演算法比較粗糙,大家有意見,及時指正。
#include<iostream> #include<string> using namespace std; int main() { int i = 0, j = 0; string temp = "0"; string str1; string str2; cin>>str1>>str2; //接受資料 if(str1.length() < str2.length()) { //交換兩個字串,使位數長的位於str1 temp = str1; str1 = str2; str2 = temp; } long length1 = str1.length(); long length2 = str2.length(); long length = length1; string result(length, '0'); //兩數相加,超過10進1 for(i = length - 1, j = length2 - 1; i >= 0 && j >= 0; i--, j--) { long sum = 0; sum = (str2[j] - '0') + (str1[i] - '0') + (result[i] - '0'); if(sum > 9) { sum %= 10; result[i] = sum + '0'; if(i != 0) result[i-1] = '1'; else result = '1' + result; } else { result[i] = sum + '0'; } } //str2的長度小於str1的話,將剩餘的str1加到result上 for(;i >= 0; i--) { long sum = 0; sum = (str1[i] - '0') + (result[i] - '0'); if(sum > 9) { sum %= 10; { result[i] = (sum + 1) + '0'; } result[i-1] = '1'; } else { result[i] = sum + '0'; } } //輸出結果,注意length+1 for(i = 0; i < length + 1; i++) cout<<result[i]; return 0; }