题目描述
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见实例 2)。
输入描述 输入共 1 行,一个整数 N,−109≤N≤109。 输出描述输出共 1 行,一个整数,表示反转后的新数。
例子: 0反转0 10 反转1 200反转2 -10反转-1 -120反转-21
/*#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,sum=0;
cin>>n;
while(n){
sum=sum*10+n%10;
cout<<sum<<endl;
n/=10;
}
cout<<sum<<endl;
printf("%d",sum);
return 0;
}
/*这种方法比较神奇,希望有人解释一下为什么可以省略0和运算负号。*/
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a;
int k=0;
cin>>a;
// bool flag=a[0]!='-';
if(a[0]!='-'){
reverse(a.begin(),a.end());//反转
while(a[k]=='0'&&k+1<a.size()/*以n.size()为5举例:k+1最小为1最大为5(k从0到4),当k+1等于5时,说明n.[0]到n.[4]都是0,所以这里是小于号*/){
k++;
}
cout<<a.substr(k,a.size())<<endl;
}
if(a[0]=='-'){
a.erase(a.begin());
reverse(a.begin(),a.end());
while(a[k]=='0'&&k+1<a.size()/*以n.size()为5举例:k+1最小为1最大为5(k从0到4),当k+1等于5时,说明n.[0]到n.[4]都是0,所以这里是小于号*/){
k++;
}
cout<<'-'<<a.substr(k,a.size())<<endl;
}
return 0;
}
/*第二种方法优化后*/
/*
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a;
int k=0;
cin>>a;
bool flag=a[0]=='-';
if(flag){
a.erase(a.begin());
}
reverse(a.begin(),a.end());
while(a[k]=='0'&&k+1<a.size()){
k++;
}
if(flag){
cout<<'-';
}
cout<<a.substr(k,a.size())<<endl;
return 0;
}
*//*核心思想:利用顺序执行思想把共同的,一定要执行的步骤简化提前执行,比如优化前后的if使用,把原本要分类讨论的思想转化成意外事件进行执行(是否是负数)*/