Integer_inversion
题目:
给你一个 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
解题思路:
我们首先来看到最终的代码:
1 |
|
代码看着确实还是非常的冗长。
因为代码中需要用到遍历,所以我们得先要算出我们输入的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
的值。