问题:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1: 输入:123,输出:321
示例 2:输入:-123,输出:-321
示例 3:输入:120,输出:21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−, ]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路与代码:
/* 思路:tmp是每次循环得到的10的余数,remainVal是除去个位之外的数(等待下次循环),每次循环的result都是上一次的result*10,
再加上本次循环的余数(tmp)。
*/
#include<stdio.h>
#include<stdlib.h>
//#define INT_MIN = -2147483648 //错误:宏重定义,INT_MAX和INT_MIN不需要定义!
//#define INT_MAX = 2147483647
int reverse(int x);
void main(void) {
int result;
signed int para = 1534236469;
result = reverse(para);
printf("%d\n", result);
system("pause");
}
int reverse(int x) {
long int result = 0; //注意点:这里要用long int, 因为如果输入x是1534236469这样的数,中间会出现964632435*10,超出了INT_MAX!
int remainVal = x;
int tmp;
//if(x == -2147483648) return 0; //第一次想这样判断是否溢出,显然不对,原因如上【注意点】
if (x / 10 == 0) return x;
while (remainVal != 0) {
tmp = remainVal % 10;
result = result * 10 + tmp;
if ((result>INT_MAX) || (result<INT_MIN))
return 0;
remainVal = remainVal / 10;
}
return result; //第一次的写法,错误。额,才知道原来【-123/10 = -12】。。。
//if (x > 0)
// return result;
//else
// return -result;
}
又遇见这种问题,同样的代码,本地IDE和网页提交结果不一样。。。哭了,Why???
知识点:
1. INT_MAX和INT_MIN不用再定义,直接使用即可。否则报错:重复宏定义。
2. int类型的数据,4个字节,每字节8位,所以int类型长度为32位。
3. 获得INT_MAX和INT_MIN的方法参考:求int型整数的最大值和最小值
4. 关于C语言中int类型数的max和min的知识点参考:C语言中,int类型的最大值和最小值
5. Latex乘方插入方法是2{31},Latex数学符号速查:【学习笔记】LaTex数学符号极简速查