《C语言入门100例》(第11例)给出四个数,输出四个数的和 | 溢出了怎么办?

【第11题】给出四个数,输出四个数的和 | 溢出了怎么办?

主要知识点

直接使用字符串输出溢出结果也是一个可取的方法。

习题

1. Leetcode 476. 数字的补数

题目描述

对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。
例如,整数 5 的二进制表示是 “101” ,取反后得到 “010” ,再转回十进制表示得到补数 2 。
给你一个整数 num ,输出它的补数。
提示: 1 ≤ n u m < 2 31 1 \leq num < 2^{31} 1num<231

初见

既然说是按位取反,那么我们直接按照题意进行计算即可:

int findComplement(int num) {
    int result(0);
    int i(0);
    while (num > 0) {
        result = result | ((num & 0x1 ^ 0x1)<<i);
        num >>= 1;
        ++i;
    }
    return result;
}

时间复杂度位 O ( l o g N u m ) O(logNum) O(logNum)(实际寻找的次数为 2 n 2^n 2n

思路

我们也可找出最高位的 1 后,找到与 n u m num num 匹配的标识符(低位均为 1),用其与 n u m num num 位或得到答案

代码
int findComplement(int num) {
    int highbit = 0;
    for (int i = 1; i <= 30; ++i) { // int,最大 31 位
        if (num >= (1 << i)) { // 记录最高位
            highbit = i;
        }
        else {
            break;
        }            
    }
    // 计算标识符
    int mask = (highbit == 30 ? 0x7fffffff : (1 << (highbit + 1)) - 1);
    return num ^ mask;
}

2. Leetcode 7. 整数反转

题目描述

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
提示: − 231 ≤ x ≤ 231 − 1 -231 \le x \le 231 - 1 231x2311

初见

求逆序数应该是很熟悉的一套东西了,唯一需要注意的是不能使用超过 32 位的存储方式。那么我们只需要在边界时做好越界判断,返回 0 即可。

代码
int reverse(int x) {
    int result(0);
    while (x != 0) {
    	// 越界判断
        if (result < INT_MIN / 10 || result > INT_MAX / 10) {
            return 0;
        }
        result = result * 10 + x % 10;
        x /= 10;
    }
    return result;
}

总结

  1. 两道题都不算难,其中第一题再次强调了位运算的重要性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值