【20190419】【每天一道算法题】整数反转(数学)

问题:

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1: 输入:123,输出:321

示例 2:输入:-123,输出:-321

示例 3:输入:120,输出:21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^{31}, 2^{31}-1]。请根据这个假设,如果反转后整数溢出那么就返回 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数学符号极简速查

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Satisfying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值