OJ练习4——T7

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; 
    }

【评价】短小精悍有没有!!!不到十行……自己太水了。

 

posted on 2015-01-14 09:17  EmmaLi  阅读(149)  评论(0编辑  收藏  举报

导航