困扰我多年的眼疾!!何时能好!!
题目是这样的
3:数字反转
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。
输入
-
输入共 1 行,一个整数N。
-1,000,000,000 ≤ N≤ 1,000,000,000。
输出
- 输出共 1 行,一个整数,表示反转后的新数。 样例输入
-
样例 #1: 123 样例 #2: -380
样例输出
-
样例 #1: 321 样例 #2: -83
来源
- NOIP2011复赛 普及组 第一题
-
- 这道题一看,诶,就很舒服,
- 一做,卧槽,耗时一下午,没办法没办法,谁叫我瞎呢
- 思路是这样的,有两种特殊情况,那我单独讨论嘛
- 1尾数有0
- 2负数
-
- 首先判断是不是负数,如果是,迭代器往后走一个,走到数字位,
-
然后reverse(才不会告诉你们我不会自己写reverse所以才强行学STL的,嘻嘻)
- 此时所有的数字都倒转了,如果尾数有0就在前面,比如3200变成了0023,00在前面
- 判断迭代器指向的地方是否为字符0,如果是就向后走,直到没有0,打印输出。 如果不是负数则是正数,
-
reverse,
- 当迭代器指向的地方为字符0时向后,打印输出。
-
- 代码如下:
-
#include<iostream> #include<vector> #include<algorithm> //push_back() #include<cstring>//strlen using namespace std; int main(){ char a[20]; vector<char> s;//动态数组 vector<char>::iterator it;//迭代器 cin>>a; int length=strlen(a); for(int i=0;i<length;i++) s.push_back(a[i]); //input it=s.begin(); if(*it=='-'){//负数 it++;//cout<<*it;移动到数字位 reverse(it,s.end());//逆序 cout<<"-"; while(*it=='0') {//如果逆序后第一位是0就往后,直到没有0 ++it; // cout<<*it; } for(;it!=s.end();++it)//输出 cout<<*it; cout<<endl; }else{//正数 reverse(s.begin(),s.end()); while(*it=='0') ++it; for(;it<s.end();++it) cout<<*it; cout<<endl; } return 0; }
-