C语言取余问题:常见难题与解决方法

![](https://img.moegirl.org.cn/common/thumb/f/fd/Kv_chizuru.jpg/800px-Kv_chizuru.jpg)

## 问题复现

#### 在一次快速幂取余时,遇到了一个十分amazing的问题:

```

// 问题代码

// MODE = 1e7;

int myPow(int a, int b){

    long long ans = 1;

    while(b){

        if(b & 1){

            ans = (ans*a) % MODE;

        }

        a = (a*a) % MODE; // problem is here

        b >>= 1;

    }

    return ans;

}

```

##### 我当时的想法是该表达式的最后已经取余了,所以返回的值用一个`int a`来接受已经足够了,但遗憾的是,运行时报错了。错误如下:

`runtime error: signed integer overflow: 65536 * 65536 cannot be represented in type 'int'`

#####???大概是表达式的值int放不下?

#### 好吧,那我改一下

```

// 问题代码_2

int myPow(int a, int b){

    long long ans = 1;

    while(b){

        if(b & 1){

            ans = (ans*a) % MODE;

        }

        a = (long long)(a*a) % MODE; // problem is here

        b >>= 1;

    }

    return ans;

}

```

#### 感觉可以了吧?显示类型转换大法,给你一个`long long`还不够你放?

结果:

` runtime error: signed integer overflow: 65536 * 65536 cannot be represented in type 'int'`

#### 额。。。。是哪里的问题呢???

![](https://i0.hdslb.com/bfs/article/792c678279622424d921fa11fc65ff7f11cea6d2.jpg@1320w_742h.webp)

>一个新的想法:会不会是接收的`int a`有问题呢?如果把`int a`换成`long long a`会不会就可以了呢?

#### ~~试试就逝世~~

#### 结果是可以的,完美运行。

### 但问题好像还没解决喔。。。

#### 再进一步试验

```

// 问题代码_2

int myPow(int a, int b){

    long long ans = 1;

    while(b){

        if(b & 1){

            ans = (ans*a) % MODE;

        }

        // problem is here

        long long temp = (a*a) % MODE;

        a = temp;

        b >>= 1;

    }

    return ans;

}

```

#### 结果发现还是报同样的错。

#### 好了,问题显而易见了 <br/>

![](https://i0.hdslb.com/bfs/article/38c0d9e54dc85673b2a9dd30d14ad5557aa05918.jpg@1320w_1010h.webp)

## <br/>发现问题

```

int myPow(int a, int b){

    long long ans = 1;

    while(b){

        if(b & 1){

            ans = (ans*a) % MODE;

        }

        // problem is here

        a = ((long long)a*a) % MODE;

        b >>= 1;

    }

    return ans;

}

```

#### 完美运行。应该是`a*a`这里的默认类型是`int`。在运算的过程中是`a*a`这里发生了整型的溢出,所以上面的方法中只有将`int a`改成`long long a`时才解决了这个问题,而其他的办法军没有涉及到错误之处。

问题解决 (^_^)

![日常加一张图](https://i0.hdslb.com/bfs/article/89b5f547d30adc7f4e83ab8144c575247ed8af20.png@1320w_1822h.webp)

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空