7. Reverse Integer

Given a 32-bit signed integer, reverse digits of an integer.

自己的代码:

 1 #include<iostream>
 2 using namespace std;
 3 class Solution {
 4 public:
 5     int reverse(int x) {
 6         cout << "x: " << x << endl;
 7         int n = 10;
 8         int ans = 0;
 9         int k = 1;
10         int flag = 0;
11         int i = 0;
12         if (x < 0) {
13             x = 0 - x;
14             flag = 1;
15         }
16         while (x%n != x) {
17             n = n * 10;
18         }
19         cout << "n: " << n << endl;
20         i = n/10;
21         while (i >= 1){
22             ans = (((x - x % i) / i) % 10)*k + ans;
23             k = k * 10;
24             if (i < 10) {
25                 break;
26             }
27             i = i / 10;
28         } 
29         cout << "ans: " << ans << endl;
30         if (ans > INT_MAX || ans < INT_MIN) {
31             cout << "aaaaa" << endl;
32         
33             return 0;
34         }
35         else {
36             cout << "bbbbbb" << endl;
37             if (flag == 1) {
38                 return (0 - ans);
39             }
40             else {
41                 return ans;
42             }
43         }
44     }
45 };
46 int main() {
47     Solution my;
48     cout << my.reverse(112233445566778899) << endl;
49     return 0;
50 }

这段代码逻辑没有问题,测试过一些位数的数字也没有问题,但是问题就处在那些超过int范围的数字,如代码中给出的那个数字,运行结果如下:

我们可以看到x已经不是原来的x了,这个并不影响程序,但是由此n也不是正常的n了,这个是这段函数出错的根本原因。

下面贴上正确代码:

 1 class Solution2 {
 2 public:
 3     int reverse(int x) {
 4         cout << "x2: " << x << endl;
 5         int flag = 1;
 6         if (x < 0) flag = -1, x *= -1;
 7         long long sum = 0;
 8         while (x) {
 9             sum = (sum * 10 + (x % 10));
10             x /= 10;
11         }
12         long long ans = sum * flag;
13         cout << "ans2: " << ans << endl;
14         return (ans > INT_MAX || ans < INT_MIN) ? 0 : ans;
15     }
16 };

9,10行是算法的精髓。

posted @ 2018-02-21 15:03  yuanninesuns  阅读(126)  评论(0编辑  收藏  举报