一. 何为溢出
我们都知道,定义一个int类型的变量实际上就是在内存中开辟了一块4个字节的空间,相当于32个比特位,而每个比特位可以存放一个二进制的数据,所以一个int类型可以存放的数据范围是[-2147483648,2,147,483,647],当大于这个数据时,int类型的空间没有空闲的位置再存放数据,就会导致溢出。
面对数据量过大的问题,一般题目都会要求我们进行mod处理,或者用数组的方式进行存储和计算,当然,在一定范围内我们也可以进行类型转换,转化为能存储大数据的类型,例如long 和long long类型。
二. 课后习题
2.1 数字的补数
题目链接:
476. 数字的补数
思路分析:
- 首先我们需要直到何为补数,一个二进制的补数其实就是把0变成1,把1变成0。
例如101的补数:010。 - 所以我们需要将其转化为二进制数,然后再将每一位进行调换,得到补数,再将补数转化为十进制。
代码如下:
nt func(int n){
int ret = 1;
while(n--){
ret *= 2;
}
return ret;
}
int findComplement(int num){
int arr[32];
int n = 0;
//转化为二进制
while(num){
arr[n++] = num % 2;
num /= 2;
}
//转化为补数
for(int i = 0; i < n; i++){
if(arr[i] == 0){
arr[i] = 1;
}
else{
arr[i] = 0;
}
}
int ret = 0;
//将补数转化为十进制
for(int i = 0; i < n; i++){
if(arr[i] == 1){
ret += func(i);
}
}
return ret;
}
2.2 整数反转
题目链接:
7. 整数反转
题解链接:
视频讲解
比起语言的抽象表达,我觉得图形化的解答会更容易明白。
代码如下:
int reverse(int x){
int ret = 0;
while(x){
if(ret < INT_MIN / 10 || ret > INT_MAX / 10){
return 0;
}
ret *= 10;
int p = x % 10;
x /= 10;
ret += p;
}
return ret;
}