给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
记一下自己的思路
- 首先是拿到这个题,我就直接考虑怎么进行反转了。
- 想到了 % 与 / 运算 然后大刀阔斧就开干了
- 后面写了个for循环实现了,差不多就这个样子
for (int j = 0; j < i; ++j) {
// i是输入数的位数
temp = var_abs % (int)(pow(10, j + 1)) / (pow(10, j));
a = a + temp *pow(10,i-j-1);
}
- 输入了个321输出123,然后就憨憨的去提交代码,啪啪打脸。执行出错,结果出错。
- 原来是忽视了一个很重要的题目条件,那就是溢出。所给的环境不允许整型溢出。
- 哎,全是辛酸泪。第一次是绝对值转化溢出,即是-2^32 ,abs()函数取绝对值后溢出。因为int型的范围是[-2^32, 2^32-1]。绝对值转化直接溢出。GG
- 对于这个一个特列,绝对值后溢出,直接if打回冷宫。
- 然后后面又是在组装的时候溢出,后面想到溢出即是正数变为负数,那我就不让你为负。判断一哈,就有了这样的代码。hhh,好沙雕的代码。
- 后来提交就成功了,emmm,之前还有好多问题,哎,调试全靠printf。不删我的调试printf了,,随意嘲笑叭。菜就完事了。
for (int j = 0; j < i; ++j) {
// i是输入数的位数
temp = var_abs % (int)(pow(10, j + 1)) / (pow(10, j));
c = temp *pow(10,i-j-1);
a = a + c;
if ((2147483647-a)>=c&&a>=0&&c>=0) {
a = a + c ;
} else
return 0;
}
C :reverse-integer
//
// Created by fitz on 2019/8/3.
//
#include <stdio.h>
#include <math.h>
int reverse(int x){
int i = 0;
int br = 0;
int var_abs;
int p = x;
int a=0;
int temp = 0;
while (p!=0){
p = p/10;
i++;
}
//2^31-1=2147483647,-2^31=-2147483648
if (x>2147483647||x<=-2147483648){
return 0;
}
if (x==0){
return 0;
}else{
if (x>0) br=1;
// printf("%d\n",x);
var_abs = abs(x);
// printf("var_abs=%d\n",var_abs);
for (int j = 0; j < i; ++j) {
temp = var_abs % (int)(pow(10, j + 1)) / (pow(10, j));
// printf("temp=%d\n",temp);
int c = temp *pow(10,i-j-1);
// printf("a=%d\t c=%d\n",a,c);
if ((2147483647-a)>=c&&a>=0&&c>=0) {
a = a + c ;
} else
return 0;
// printf("这是第%d次,此时temp=%d,a=%d\n",j,temp,a);
}
}
if (br==1)
return a;
else
return -a;
}
int main(){
int z = 1534236469;
int result = reverse(z);
printf("%d",result);
return 0;
}