使用C++实现给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零
时间: 2024-04-30 09:23:40 浏览: 20
。例如,输入123,输出321;输入-321,输出-123。
代码如下:
```c
#include <stdio.h>
int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > INT_MAX/10 || (rev == INT_MAX/10 && pop > 7)) return 0;
if (rev < INT_MIN/10 || (rev == INT_MIN/10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
int main() {
int x = 123;
printf("%d\n", reverse(x));
int y = -321;
printf("%d\n", reverse(y));
return 0;
}
```
解释:
- reverse函数中,通过while循环逐位取出x中的数字,将其加入rev中,实现翻转数字的效果。
- 在加入rev之前,通过两个if语句判断翻转后的数字是否超过int类型的范围,若超过则返回0。这是因为在翻转数字时可能会出现溢出的情况,需要进行判断。
- 在main函数中,分别对123和-321进行翻转,打印结果。
相关问题
使用C++给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零
。示例:
输入:123
输出:321
输入:-123
输出:-321
输入:120
输出:21
解题思路:
我们可以将该整数从低位到高位的每一位数字依次取出,然后反转过来,最后组成一个新的整数。需要注意的是,如果原数为负数,则新数也应该为负数,且需要将原数的符号位去掉再进行反转。
代码实现:
int reverse(int x){
int flag = 1; // 标记正负号
if(x < 0){
flag = -1;
x = -x;
}
long long res = 0; // 新数
while(x){
res = res * 10 + x % 10;
x /= 10;
}
res *= flag; // 恢复符号
if(res > INT_MAX || res < INT_MIN) // 溢出判断
return 0;
return res;
}
给定一个整数可以为负将该数各个位上的数字反转得到一个新的数字,新数不得有多余的前导0
算法思路:
1. 将给定整数转换为字符串;
2. 对于正数,直接反转字符串并转换为整数;
3. 对于负数,先将负号去掉,再反转字符串,最后将结果加上负号。
时间复杂度:O(n),其中 n 为数字的位数。
Python 代码实现:
```python
def reverse_integer(x):
if x == 0:
return 0
elif x > 0:
s = str(x)
y = int(s[::-1])
else:
s = str(-x)
y = -int(s[::-1])
return y if y.bit_length() < 32 else 0
```
C++ 代码实现:
```cpp
#include <iostream>
using namespace std;
int reverse_integer(int x) {
if (x == 0) {
return 0;
} else if (x > 0) {
string s = to_string(x);
reverse(s.begin(), s.end());
long long y = stoll(s);
return y > INT_MAX ? 0 : y;
} else {
string s = to_string(-x);
reverse(s.begin(), s.end());
long long y = -stoll(s);
return y < INT_MIN ? 0 : y;
}
}
int main() {
int x = -123;
int y = reverse_integer(x);
cout << y << endl; // 输出 -321
return 0;
}
```