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行是算法的精髓。