【模板】快速幂
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<algorithm> using namespace std; long a, k, p, n; long quc(long a, long k, long p) { int res = 1; while(k) { if(k & 1) res = res*a%p; a = a*a%p; k >>= 1; } return res; } int main() { scanf("%ld", &n); for(int i = 1; i <= n; i++) { scanf("%ld%ld%ld", &a, &k, &p); printf("%ld/n", quc(a, k, p)); } return 0; }
例题:leetcode 50 pow(x,,n)
错误代码及报错信息
class Solution { public: double quic(double a, int k) { k = (long long)k; double res = 1; int flag = 0; if(k < 0) {k = -1*k; flag = 1;} //这里将k变成了正数 while(k) { if(k & 1) res *= a; a *= a; k >>= 1; } if(flag) return 1/res; else return res; } double myPow(double x, int n) { if(x == 1) return 1; if(n == 0) return 1; return quic(x, n); } };

从出错信息可以看出是整数溢出
而且输入是-2147483648
由于int的范围是-2147483648~2147483647,由于我写的代码判断k位负数时会将它变成正数。而Int类型正数和负数的范围相差了1,当输入为-2147483648是,让他变成正数就会溢出。
故尝试将k的类型变成long long ,问题即可解决

浙公网安备 33010602011771号