#include <string> #include <vector> #include <cstdlib> // 非负大整数相加 // 思路: // 1. 翻转两个字符串。 // 2. 依次相加两数的各位的,存储至vector<int>中,注意符数转换。 // 3. 依次对vector<int>中每个不小于10的数,保留个位,进位1加到后一位置的数中,最终到容器尾部若还有进位,要扩充一个位置。 // 4. 将最终的vector<int>每位置数字经数传转换并存储到一个string中。 // 5. 将得到的string倒序后输出。 int char2int(char c); // 符数转换 char int2char(int i); // 数符转换 using namespace std; string sum2big(string& strLeft, string& strRight){ // flip reverse(strLeft.begin(), strLeft.end()); reverse(strRight.begin(), strRight.end()); // length size_t ll = strLeft.length(); size_t lr = strRight.length(); size_t loopMax = max(ll, lr); size_t loopMin = min(ll, lr); if (loopMin==0) return ""; // 依次相加两数的各位的,存储至vector<int>中,注意符数转换。 bool llgreater = loopMax <= ll; vector<int> sumPerPos; int i = 0; while (i<loopMin) { sumPerPos.push_back(char2int(strLeft[i])+char2int(strRight[i])); i++; } // 对于位数较长的直接挪过来 if (llgreater) { while (i++<loopMax) { sumPerPos.push_back(char2int(strLeft[i])); } } else { while (i++<loopMax) { sumPerPos.push_back(char2int(strRight[i])); } } // 依次对vector<int>中每个不小于10的数,保留个位,进位1加到后一位置的数中,最终到容器尾部若还有进位,扩充一个位置。 bool append = false; for (int j = 0; j < loopMax; j++) { if (sumPerPos[j]>=10) { sumPerPos[j] -= 10; if (j+1 < loopMax) { sumPerPos[j+1] += 1; } else { sumPerPos.push_back(1); append = true; } } } // 将最终的vector<int>每位置数字经数传转换并存储到一个string中。 size_t newLen = append ? loopMax+1 : loopMax; string newStr; int k = 0; while(k < newLen){ newStr.push_back(int2char(sumPerPos[k++])); } // 倒序后输出 reverse(newStr.begin(), newStr.end()); return newStr; } int char2int(char c){ return c - '0'; } // 符数转换 char int2char(int i){ return i + '0'; } // 数符转换
全部评论
(0) 回帖