c++ - 当我们将变量“u”的数据类型从 long long 更改为 int 时,为什么模幂运算会出错?
问题描述
当变量“u”的数据类型很长时,模幂运算效果很好,但是当它更改为 int 时,它会给出错误的答案。
例如,当 (2,447,1e9+7) 作为参数传递时,“long long u”给出 941778035 作为答案,但“int u”给出 0 作为答案。功能如下:-
int modpow(int x, int n, int m) { //to calculate x^n%m
if (n == 0) return 1%m;
long long u = modpow(x,n/2,m);
u = (u*u)%m;
if (n%2 == 1) u = (u*x)%m;
return u;
}
int modpow(int x, int n, int m) { //to calculate x^n%m
if (n == 0) return 1%m;
int u = modpow(x,n/2,m);
u = (u*u)%m;
if (n%2 == 1) u = (u*x)%m;
return u;
}
int main(){ //used as main in program with x = 2 and m = 1e9+7 and n is given by user
int n, m = 1e9+7;
cin>>n;
int pow = modpow(2,n,m);
cout<<pow;
return 0;
}
解决方案
想一想modpow(1e9, 2, 1e9+7)
if (2 == 0) // no
int u = modpow(1e9, 1, 1e9+7);
if (1 == 0) // no
int u = modpow(1e9, 0, 1e9+7);
if (0 == 0) return 1;
int u = 1;
u = 1; // (1*1) % (1e9+7)
if (1 % 2 == 1) u = 1e9; // (1 * 1e9) % (1e9+7)
int u = 1e9;
u = (1e9 * 1e9)%(1e9+7); // OUCH!
1e9 * 1e9 如果int u
只有 32 位宽,则溢出,这是大多数现代计算机环境的情况(请参阅https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models)
推荐阅读
- html - Flex Item is expanding beyond its parent Flex container
- swift - How to changhe the opacity of a button in Swift for an X amount of time
- para - 按照 Para 安装步骤并得到“连接失败。运行”para-cli setup“或检查配置文件”
- ios - 通过 CLI 函数向 iOS 发送推送通知
- java - 有没有办法比较字符串而不考虑一系列逗号中对象的顺序?
- android - 如何让功能更简单
- jmeter - Unable to access jar file for jmeter
- java - Memory leak while using mysql-java-drive and spring-jdbc
- c# - 为什么C#的十进制使用二进制整数有效位?
- c++ - Print integer from array A based on array B integer?