上海交大OJ 高精度整數
阿新 • • 發佈:2018-11-15
1014. 高精度加法
Description
輸入2個整數a和b,輸出a+b。
Input Format
輸入有兩行,第一行a,第二行b。
0≤a,b≤10 100000 0≤a,b≤10100000 。
Output Format
輸出只有一行,a+b。
Sample Input
1234
1111111111
Sample Output
1111112345
#include <cstdio> #include <iostream> #include <cstring> #include <vector> using namespace std; int main(int argc, char const *argv[]) { string a,b; cin >> a >> b; //sa - a轉化成的陣列 sb - b轉化成的陣列 char sa[1000005]; char sb[1000005]; //進行字串 - 字元陣列轉化 strcpy(sa,a.c_str()); strcpy(sb,b.c_str()); //用於儲存計算結果 vector<int> u; //標誌是否進位 int t = 0; //當上面的數筆下面的數長時 if(a.length() > b.length()){ for(int i = a.length(),j = b.length();i > 0;i--,j--){ //當此位有兩個數時 if(j > 0){ //當不進位的時候 if((sa[i - 1] - '0') + (sb[j - 1] - '0') + t < 10){ //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t); //同位相加入棧 u.push_back((sa[i - 1] - '0') + (sb[j - 1] - '0') + t); t = 0; }else{//當進位時 //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t - 10); u.push_back((sa[i - 1] - '0') + (sb[j - 1] - '0') + t - 10); t = 1; } }else{//當此位只剩一個數時 //當不進位的時候 if((sa[i - 1] - '0') + t < 10){ //同位相加入棧 u.push_back((sa[i - 1] - '0') + t); t = 0; }else{//當進位時 //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t - 10); u.push_back((sa[i - 1] - '0') + t - 10); t = 1; } } } if(t > 0)u.push_back(t); } else{//當下面數比上面長時 for(int i = a.length(),j = b.length();j > 0;i--,j--){ if(i > 0){ if((sa[i - 1] - '0') + (sb[j - 1] - '0') + t < 10){ //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t); u.push_back((sa[i - 1] - '0') + (sb[j - 1] - '0') + t); t = 0; }else{ //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t - 10); u.push_back((sa[i - 1] - '0') + (sb[j - 1] - '0') + t - 10); t = 1; } }else{ if((sb[j - 1] - '0') + t < 10){ //同位相加入棧 u.push_back((sb[j - 1] - '0') + t); t = 0; }else{//當進位時 //printf("%d\n",(sa[i] - '0') + (sb[j] - '0') + t - 10); u.push_back((sb[j - 1] - '0') + t - 10); t = 1; } } } if(t > 0)u.push_back(t); } //出棧輸出結果 while (!u.empty()) { printf("%d",u.back()); u.pop_back(); } return 0; }