零、写在前面
这个系列不经常更新,今天这个题目又双叒叕觉得有点意思,我们一起看一看,主要知识点在
【第11题】给出四个数,输出四个数的和 | 溢出了怎么办?https://blog.csdn.net/WhereIsHeroFrom/article/details/118237457
一、主要知识点
1.溢出处理
由于数据的量级只有,所以只有四个数字都是最大的时候才会产生溢出
#include <stdio.h>
typedef unsigned long long ull; //换名
const ull MAX = (((ull)1)<<62); //需要对1进行类型转换
int main() {
int t;
ull a, b, c, d;
scanf("%d", &t);
while (t--) {
scanf("%llu %llu %llu %llu", &a, &b, &c, &d); // 读入数据
if (a == MAX && b == MAX && c == MAX && d == MAX) // 判断溢出条件
printf("18446744073709551616\n"); // 溢出的值只能用字符串
else
printf("%llu\n", a + b + c + d); // 非溢出直接返回
}
return 0;
}
2.异或运算
这个曾经写过 参考这里的知识点
[解题报告]《算法零基础100讲》(第16讲) 变量交换算法https://blog.csdn.net/qq_17593855/article/details/121156818
二、课后习题
476. 数字的补数
476. 数字的补数https://leetcode-cn.com/problems/number-complement/思考
扫描所有位取反就好了,利用上面的异或方法,一个数字对1取异或就可以得到这个数字的取反。
int findComplement(int num){
for(int i = 0;num >> i;i++)//扫描所有位取反
num = num ^ (1 << i);
return num;
}
结果分析
凑合玩
7. 整数反转
7. 整数反转https://leetcode-cn.com/problems/reverse-integer/
思考
按照要求进行返回就好了,但是在反转过程中要注意有没有超出限制,一开始都用负数处理,因为负数的表示范围大。
int reverse(int x){
int ans = 0;bool flag = false;
int min_int = -2147483648;
if(x > 0){ //符号处理
x = -x;
flag = true;
}
for(int i = 0;x;++i){ //处理最终结果
if(ans < min_int / 10) return 0;//溢出
ans *= 10;
if(ans < min_int - (x%10)) return 0;//溢出
ans += (x%10);
x /= 10;
}
if(flag && ans == min_int) return 0;
if(flag) ans = -ans;
return ans;
}
结果分析
还行哈?
写在最后
这个系列确实是不怎么更新,今天这两道题需要注意的细节比较多,并且位运算比较有意思,所以还是建立一个合集,有需要的欢迎关注。