【模板】快速幂

#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 ,问题即可解决

 

posted @ 2019-11-10 15:10  ATKevin  阅读(92)  评论(0)    收藏  举报