[题解]《C语言入门100例》(第11例) 溢出

一. 何为溢出

  我们都知道,定义一个int类型的变量实际上就是在内存中开辟了一块4个字节的空间,相当于32个比特位,而每个比特位可以存放一个二进制的数据,所以一个int类型可以存放的数据范围是[-2147483648,2,147,483,647],当大于这个数据时,int类型的空间没有空闲的位置再存放数据,就会导致溢出。
  面对数据量过大的问题,一般题目都会要求我们进行mod处理,或者用数组的方式进行存储和计算,当然,在一定范围内我们也可以进行类型转换,转化为能存储大数据的类型,例如long 和long long类型。

二. 课后习题

2.1 数字的补数

题目链接:
476. 数字的补数
思路分析:

  1. 首先我们需要直到何为补数,一个二进制的补数其实就是把0变成1,把1变成0。
    例如101的补数:010。
  2. 所以我们需要将其转化为二进制数,然后再将每一位进行调换,得到补数,再将补数转化为十进制。

代码如下:

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;
}

猜你喜欢

转载自blog.csdn.net/qq_53060585/article/details/121286048