【PAT1001】-A+B Format

方法一

实现思路

将结果相加,将得到的结果从低位到高位,每三位处理为字符串存储到数据结果中,同时将额外增加的逗号处理添加到数据结果中,将处理好的数据结果,依次打印得到结果。

数据结构的选择
由于先从低位开始处理,但输出的结果是从高位开始的,所以将结果存储到栈中

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的转换,而且在这个转换过程中需要额外考虑很多

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/114282574
今日推荐