C++大整數(shù)加法解題思路及參考代碼
題目
輸入
輸入數(shù)據(jù)有多組。首先輸入一個(gè)整數(shù)T,表示有T組輸入。
每組輸入兩個(gè)大整數(shù),并用空格隔開。每個(gè)整數(shù)最多1000位。沒有負(fù)數(shù)輸入。
輸出
對(duì)于每組輸入,輸出兩個(gè)整數(shù)的和,單獨(dú)占一行。
樣例輸入
2 1 2 112233445566778899 998877665544332211
樣例輸出
3 1111111111111111110
解題思路
這個(gè)整體思路大家都知道,要注意的點(diǎn)就是在邊界情況的處理上,比如進(jìn)位的操作,最高位進(jìn)位判斷這些。還有可能有前導(dǎo)0的情況;
參考代碼
#include<bits/stdc++.h> using namespace std; string get_add(string a, string b) { int i, add = 0, len = max(a.length(), b.length()); int nums[1001] = {0}; reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); for(i = 0; i < len; i++) { int num1 = (i < a.length()) ? (a[i]-'0') : 0; int num2 = (i < b.length()) ? (b[i]-'0') : 0; int num = num1 + num2 + add; nums[i] = num % 10; add = num / 10; } if(add > 0) // 處理最高位進(jìn)位 nums[i] = add; string c; while(i >= 0) { // 數(shù)組逆序拼接得到結(jié)果 c += to_string(nums[i]); i--; } if(c[0] == '0' && c.length() > 1) // 移除前導(dǎo)0 c.erase(0, 1); return c; } int main() { int T; cin >> T; string a, b; getline(cin, a); while(T--) { cin >> a >> b; string c = get_add(a, b); cout << c << endl; } return 0; }
附:c++ 大整數(shù)加法、減法、乘法
#include<string.h> #include<iostream> std::string add(std::string s1,std::string s2) { std::string s3; if(s1.length()<s2.length()) { while(s1.length()<s2.length()) { s1="0"+s1; } } else { while(s2.length()<s1.length()) { s2="0"+s2; } } int up=0; int k; int len=s1.length()-1; while(len>=0) { k=(s1.at(len) + s2.at(len) + up - '0' - '0'); up = k/10; s3=(char)(k % 10 + '0') + s3; len--; } if(up) s3="1"+s3; return s3; } std::string sub(std::string s1,std::string s2) { if(s1==s2) { return "0"; } std::string s3; bool flag=false; if(s1.length()<s2.length() || (s1.length()==s2.length() && s1<s2)) { std::string s=s1; s1=s2; s2=s; flag=true; } else { s3=""; } while(s2.length()<s1.length()) { s2="0" + s2; } int k,down=0; for(int i=s1.length()-1; i>=0; i--) { k=s1[i] -s2[i] +down; if(k<0) { down=-1; k=10+k; } else { down=0; } s3=(char)('0' + k) + s3; } k=0; while(s3[k]=='0' ) { k++; } s3=s3.substr(k); if(flag) s3="-"+s3; return s3; } std::string mul(std::string s1,std::string s2) { if(s1=="0" || s2=="0") return "0"; if(s1=="1") return s2; if(s2=="1") return s1; std::string s3; int len=s1.length() + s2.length() -1; for(int i=0; i<len; i++) { s3+="0"; } int up=0,k; std::string flag=""; for(int i=s1.length()-1; i>=0; i--) { for(int j=s2.length()-1; j>=0; j--) { k=s3[i+j]-'0' + (s1[i]-'0')*(s2[j]-'0') ; up=k/10; s3[i+j]=(char)(k%10+'0'); int d=1; while(up>0) { //首位進(jìn)位 if(i==0 && j==0 && up>0) { flag=(char)("0"+ up); break; } k=(char)(s3[i+j-d]+up-'0'); up=k/10; s3[i+j-d]=(char)(k%10+'0'); d++; } } } return flag + s3; }
總結(jié)
到此這篇關(guān)于C++大整數(shù)加法解題思路及參考代碼的文章就介紹到這了,更多相關(guān)C++大整數(shù)加法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用QGraphicsView實(shí)現(xiàn)氣泡聊天窗口+排雷功能
這篇文章主要介紹了使用QGraphicsView實(shí)現(xiàn)氣泡聊天窗口+排雷,重點(diǎn)給大家介紹使用QWebEngineView控件內(nèi)嵌html+CSS的實(shí)現(xiàn)方式,需要的朋友可以參考下2022-04-04vs2022啟動(dòng)一個(gè)CmakeLists.txt項(xiàng)目的實(shí)踐
本文主要介紹了vs2022啟動(dòng)一個(gè)CmakeLists.txt項(xiàng)目的實(shí)踐,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06完美解決QT?QGraphicsView提升到QChartView報(bào)錯(cuò)的問題
使用QT提供的QChartView來繪制圖表,提升QGraphicsView控件繼承QChartView后,然后將QGraphicsView提升到我們自己寫的類,怎么才能確保提升后編譯不報(bào)錯(cuò)呢,下面小編給大家?guī)砹薗T QGraphicsView 提升到QChartView報(bào)錯(cuò)解決方案,感興趣的朋友一起看看吧2023-05-05C語(yǔ)言 數(shù)據(jù)存儲(chǔ)方式知識(shí)點(diǎn)詳解
在本篇文章里小編給大家整理的是關(guān)于C語(yǔ)言 數(shù)據(jù)存儲(chǔ)方式知識(shí)點(diǎn)詳解,有需要的朋友們可以學(xué)習(xí)參考下。2020-02-02關(guān)于STL的erase()陷阱-迭代器失效問題的總結(jié)
下面小編就為大家?guī)硪黄P(guān)于STL的erase()陷阱-迭代器失效問題的總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12C++基于boost asio實(shí)現(xiàn)sync tcp server通信流程詳解
這篇文章主要介紹了C++基于boost asio實(shí)現(xiàn)sync tcp server通信的流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07