方法一
实现思路
将结果相加,将得到的结果从低位到高位,每三位处理为字符串存储到数据结果中,同时将额外增加的逗号处理添加到数据结果中,将处理好的数据结果,依次打印得到结果。
数据结构的选择
由于先从低位开始处理,但输出的结果是从高位开始的,所以将结果存储到栈中
int和string的转换:
由于C++语言的特性,在stack中只能存储一种形式,所以在stack中存储的为为string字符串。选择每三位进行存储,如10,000,需要解决这样的问题000怎么转换为000自付出,而非一个0,所以在最后转换时没有使用现成的函数,而是尝试自己实现,在实现的最后发现如果为首位的情况下10,000中的10其实就不需要额外保留0了
结果中的正负问题
在最后实现时,我额外考虑了一下正负,如果在最后处理最高位时发现为负,再输出负号
实现代码
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int a, b;
string tostring(bool end,int x) {
stack<char> xx;
int i = 0;
while (x) {
xx.push('0' + (x % 10));
x = x / 10;
i++;
}
string s = "";
while (!xx.empty()) {
s += xx.top();
xx.pop();
}
for (int j = 0;!end &&j < 3 - i;j++) {
s = "0" + s;
}
return s;
}
int main() {
cin>> a;
cin>> b;
stack<string> re;
int plus;
plus = a + b;
//if (plus / 1000 == 0) cout << plus;
bool end = false;
if (plus == 0) cout << 0;
while (plus) {
if (plus / 1000 == 0) end = true;
re.push(tostring(end,abs(plus) % 1000));
if (!end) {
re.push(",");
}
else {
if (plus < 0) re.push("-");
}
plus = plus / 1000;
}
while (!re.empty()) {
cout << re.top();
re.pop();
}
return 0;
}
方法二
实现思路
将相加得到的结果进行分解,存储到vector中,从后往前遍历vector,根据特点发现数组下标恰好为3的倍数时需要输出一个逗号。
特殊情况负数和0的情况:
为0直接输出;
为负先输出一个负号,然后将结果变为正数再进行处理
实现代码
总结
我的方法一有的缺陷在于,不具有通用性,彼此之间有交叉,应该先输出负号后一致化处理这样较为方便,再就是可以利用特点,根据下标的位置进行输出逗号,也不需要进行int和string的转换,而且在这个转换过程中需要额外考虑很多