您的位置:首页 > 其它

P1307 数字反转

2020-03-01 22:47 127 查看

题目描述

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

输入格式

一个整数 NN

输出格式

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

输入输出样例
输入 #1

123

输出 #1

321

输入 #2

-380

输出 #2

-83

数据范围

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

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stack>
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<iostream>
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会没掉的(自己去试)
}

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

  • 点赞
  • 收藏
  • 分享
  • 文章举报
enjoy_code_ 发布了47 篇原创文章 · 获赞 0 · 访问量 861 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: