数字反转
题目大意
输入一个数字,输出其各位数字反转的数,例如123,输出321。-380,输出-83。
思路
用字符串存储数据,然后单独处理正负数,还有末尾0。
#include<iostream>
using namespace std;
int main(){
string s,res;
cin>>s;
if(s[0] != '-'){
for(int i = s.size() - 1 ; i >= 0; i --){
// //处理反转第一个为0的特殊情况
if(!(s[i] == '0'&& res.size() == 0)){
res +=s[i];
}
}
}
else{
cout<<"-";
for(int i = s.size() - 1 ; i > 0; i --){
// //处理反转第一个为0的特殊情况
if(!(s[i] == '0'&& res.size() == 0)){
res +=s[i];
}
}
}
cout<<res;
return 0;
}
感觉没有错,但是当样例为0的时候,什么也不输出。也说明了上述代码的逻辑不严谨。
上述代码加个特判当数据为0的时候,输出0,才算严谨。
- 可以用c++的算法库中的反转reverse(s.begin(),s.end())
更漂亮的写法
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string s;
cin>>s;
if(s[0] == '-')
{
cout<<'-';
s.erase(s.begin());//删除'-'号
}
//反转字符串
reverse(s.begin(),s.end());
//去除前导0
while(s.size() > 1 && s[0] =='0') s.erase(s.begin());
cout<<s<<endl;
return 0;
}
- 也可以用int类型存,对于负数,先输出输出负号,对负数处理成正数,这样只处理正数反转以及去除前导零的逻辑就行
- 对于正数,可以推测公式,每次*10,即使最高位为0,0X10也为0。
#include<iostream>
using namespace std;
int res;
int main()
{
int n;
cin>>n;
if(n < 0 )
{
cout<<"-";
n = -n;
}
while(n)
{
res = res*10 + n%10;
n /= 10;
}
cout<<res;
return 0;
}