给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123 输出:321
示例 2:
输入:x = -123 输出:-321
示例 3:
输入:x = 120 输出:21
示例 4:
输入:x = 0 输出:0
我们首先来看到最终的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int reverse(int x) {
char num[20] = {0};
sprintf(num, "%d", x); // 将整数转换为字符串
int length = strlen(num); // 获取字符串长度
// 不是去掉末尾的0
while (length > 0 && num[length - 1] == '0') {
num[length - 1] = '\0';
length--;
}
//如果有-号位置保持在num[0]不变
for(int i = 0; i < length; i++)
{
if(num[i] == '-')
{
continue;
}
else
{
char temp = num[i];
num[i] = num[length - 1];
num[length - 1] = temp;
length--;
}
}
char *endptr;
long long result = strtoll(num, &endptr, 10);
if (result > 2147483647 || result < -2147483648)
{
return 0;
}
else {
return (int)result;
}
}
int main() {
int x;
printf("please input \n"); // 确保有换行符
fflush(stdout);
scanf("%d", &x);
printf("%d \n", reverse(x)); // 确保有换行符
return 0;
}
代码看着确实还是非常的冗长。
因为代码中需要用到遍历,所以我们得先要算出我们输入的x的length,这个我们之前就已经学习过了,先格式化为字符串,然后使用strlen函数去获取字符串的长度。
我们看到示例中的几个例子,其中有包含了这些元素,负号,0。根据示例我们可以去对每个部分做算法。
关于末尾0的问题,我想到的就是直接让末尾的0为空,然后继续做反转字符串。如果遇到开头是负号的整数的话,我们就直接将负号continue掉。然后继续做反转字符串。然后为了防止他溢出,我们需要在做处理整数溢出的方式。
问题样式:
在main函数部分我们可以看到我添加了一个fflush(stdout)
,这是因为我在最开始调试代码的时候发现我的程序时先输入的x,然后才会给我显示我们的提示语,即使我加了\n
也不行。然后我就在想这是什么问题
首先我考虑的是缓冲区的问题
我们可以看到我们的printf("please input \n");
的的确确有\n
但是还是没有出发行缓冲,这就是因为我们printf过后,但当程序紧接着调用 scanf
时,输入操作可能导致输出缓冲区未被及时刷新。还有可能就是,终端可能在等待输入时,暂时挂起输出缓冲区的刷新,导致提示信息直到输入完成后才显示。
那我们可以根据我们代码运行的结果来判断到底是那种问题。
解决思路: 既然我们的缓冲区没有正常的被刷新的话,那我们直接让他执行完printf就刷新不就可以了吗。 那我们就可以使用fflush(stdou);来使得我们的程序强制刷新缓冲区。
问题代码:
我们可以看到这里我们输入了一个很长的一段数字,但是他却并不是给我们返回0,这里其实就是已经溢出了。我们输入的是1534236469
。
这个范围确确实实还在int的范围内,但是我们这里去的是result的结果,取反之后的结果是9646324351
但是这个值已经远远的大于了我们int的最大值,所以我们这里就溢出了,正常来说的话,我们应该让他去return 0;
。
解决思路: 因为int的最大范围已经远远的小于了取反之后的数,那我们就用一个更大范围的一个类型,我想到了
long long
,我们通过改完类型之后,在调式一遍发现还是不行,然后我们再排查一遍问题,发现这一次的问题出现再strtol
这个函数,因为strtol
返回的是long int
的值,我们需要换成strtoll
,因为strtoll
返回的是long long int
的值。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。