P1307 数字反转

题目描述

给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。

输入格式

一个整数 NN

输出格式

一个整数,表示反转后的新数。

输入输出样例
输入 #1

123

输出 #1

321

输入 #2

-380

输出 #2

-83

数据范围

-1,000,000,000≤N≤1,000,000,000

#include
#include
#include
#include
using namespace std;

stack<char> a;		//代码优化,做全局变量

void Output() {		//原来重复利用的代码块专门提取出来,成为输出函数模块
	char n;
	if(a.top() == '\n')
		a.pop();		//把最后输进去的换行符\n给去掉

	if (a.top() == '0' ) {		//把原数末尾可能的多个零给去掉
		do {
			a.pop();
		} while (a.top() == '0');
	}
	while (!a.empty()) {		//循环出栈即可
		n = a.top();
		printf("%c", n);
		a.pop();
	}
}

int main() {
	
	char n;
	cin >> n;
	if (n == '-') {//负数的情况
		printf("%c", n);
		while (n != '\n') {
			scanf("%c", &n);	//这两条基本语句在正数和负数不同情况中要调整顺序
			a.push(n);
		}
		Output();
	}
	else {			//正数的情况
		while (n != '\n') {
			a.push(n);
			scanf("%c", &n);
		}
		Output();
	}
	
	return 0;
}



思路:把每一个输入的数据按字符存储,存储形式是stack栈,分为正负两种情况处理。然后弹栈实现反转,对某些特殊位置进行判断处理即可。

这种解决方案的优点是基本不会超过数据长度上限(经过测试,32位数也可以成功反转),而且效率比较高。对于刷题者来言,代码长度还可以,利用STL的模板可以达到快速刷题的目的。

注意:这次的输入输出我为了提高效率才使用了scanf和printf,在洛谷刷题系统中,有编译错误后的提醒,清晰提醒我头文件必须包含< cstido>才可以,否则scanf、printf不能编译通过。下次蓝桥杯刷题时务必记得添加该头文件

最后添加一个大佬(作者: 周羿轩)的代码:

#include
using namespace std;
int n = 0, s = 0;
int main() {
	for (cin >> n; n != 0; n /= 10)
		s = s * 10 + n % 10;//暴力直接循环搞 
	cout << s; return 0;//输出,0会没掉的(自己去试) 
}

真的快省狠!!!!膜拜。

你可能感兴趣的:(洛谷刷题)