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会没掉的(自己去试) }
真的快省狠!!!!膜拜。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- P1307 数字反转
- <NOIP> 9 . P1307 数字反转
- 洛谷——P1307 数字反转
- P1307 数字反转
- 洛谷P1307 数字反转
- 【模拟】洛谷 P1307 数字反转
- P1307数字反转
- P1307 数字反转(#1 - 8)
- 洛谷 P1307 数字反转
- 洛谷P1307 数字反转
- 洛谷 P1307 数字反转
- P1307 数字反转
- P1307 数字反转 luogu
- 将整形数据转换为反转数字字符串输出
- NOIP2011复赛普级组&nbsp;数字反转
- Poj 1504 Adding Reversed Numbers(用字符串反转数字)
- Leetcode 7 Reverse Integer 反转数字
- leetcode 5.ReverseNum 数字反转
- <OJ_Sicily>数字反转
- LeetCode 7. Reverse Integer C++--带正负号数字反转