
## 问题复现
#### 在一次快速幂取余时,遇到了一个十分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'`
#### 额。。。。是哪里的问题呢???

>一个新的想法:会不会是接收的`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/>

## <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`时才解决了这个问题,而其他的办法军没有涉及到错误之处。
问题解决 (^_^)
