老规矩:有不懂的评论区见,有问必答
题目:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
本题注意:怎样判断溢出
法一:先得到x的位数,再通过求余和除10操作得到反转后数字
判断溢出:if ((2147483647-a)>=c&&a>=0&&c>=0)
直接上代码
#include <stdio.h>
#include <math.h>
int reverse(int x){
int i = 0;
int br = 0;
int var;
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;
var_abs = abs(x);
for (int j = 0; j < i; ++j) {
temp = var % 10;
var/=10;
int c = temp *pow(10,i-j-1);
if ((2147483647-a)>=c&&a>=0&&c>=0) {
a+=c;
} else
return 0;
}
}
if (br==1)
return a;
else
return -a;
}
int main(){
int z;
scanf("%d",&z);
int result = reverse(z);
printf("%d",result);
return 0;
}
代码有点多,看下面优化代码
法二:直接进行求余,除10操作,并且每次循环都判断是否溢出
#include <stdio.h>
#include <stdlib.h>
int main()
{
int z,result;
scanf("%d",&z);
result=reverse(z);
printf("%d\n",result);
return 0;
}
int reverse(int x)
{
int res = 0;
while(x!=0) {
//每次取末尾数字
int temp = x%10;
//判断是否 大于 最大32位整数
if (res>214748364 || (res==214748364 && temp>7)) {
return 0;
}
//判断是否 小于 最小32位整数
if (res<-214748364 || (res==-214748364 && temp<-8)) {
return 0;
}
res = res*10 + temp;
x /= 10;
}
return res;
}