Reverse Integer
Example1: x = 123, return 321
Example2: x = -123, return -321
2015.4.8重做
一开始还是想用vector或字符串表示结果,可见自己做出来的思路印象最深刻。
这道题的关键是除法和取余的运算。
重新写的代码忽略了溢出的情况,溢出可能出现在reverse后数据大于INT_MAX.所以要判断res,而不是x。
只能把res定位long类型,这样才可以得到更小类型的int结果。
【第一稿】
#include<iostream> #include<string> using namespace std; int main() { int x; cin>>x; string s=""; while(x>0) { s+=x%10+48; x/=10; } int base=1; int result=0; for(string::size_type i=s.size();i>0;i--){ result+=((int)s[i-1]-48)*base; base*=10; } return 0; }
【评价】不适用于负数。例如,输入-123,输出0.
对于末尾为0的数,例如:输入10100,应该是输出101吧?
题目提示说还要考虑溢出的问题,如果用字符串表示转换后的结果,再计算其十进制数,是否不用考虑数字太大的溢出问题?
【第二稿】
在第一稿的基础上修改了负数的bug,但是将main中的process改成class中封装的函数,就不能运行正确了,单单字符串反转表示就出错,找不到错因。
放弃用字符串,使用纯计算:
int reverse(int x) { int x0,y; if(x<0) x0=0-x; int base1=1; int base2=1; while(x0/base1>=10){ base1*=10; } //cout<<base1<<endl; long results=0; while(x0>0){ y=x0/base1; x0%=base1; results+=y*base2; base1/=10; base2*=10; } if(x<0) results=0-results; return results; }
【结果】在自己的编译器上可以(没有处理溢出),但在oj上不行,比如输入1也不能通过。
后来看了网上的答案。。。。无语凝噎
int reverse(int x) { long res = 0; while(x) { res = res*10 + x%10; x /= 10; } if(res>2147483647||res<-2147483648) return 0; else return res; }
【评价】短小精悍有没有!!!不到十行……自己太水了。