计算pow(x,n)%d时的拐角情况

时间:2017-06-05 07:03:35

标签: algorithm pow mod

我为x的正负值提出了上述问题的工作代码。并且大多数情况的答案是正确的,但是代码在一个极端情况下失败了,我似乎无法找到问题所在!我错过了什么条件:`

int pow(int x, int n, int d) {
int i=0,rem=1;
long long l;
    if(x==0)
    {
        return 0;
    }
    if(x==1)
    {
        return 1;
    }
    if(n==0)
    {
        return 1;
    }
    x=x%d;
    if(n%2==0||n==0)
    {
        l = ((pow(x,n/2,d))*(pow((x),n/2,d)))%d;
    }
    else
    {
        l = ((x)*(pow(x,(n-1)/2,d))*(pow((x),(n-1)/2,d)))%d;
    }
    if(x<0 && n%2!=0)
    {
        return d+l;
    } 
    else
    {
        return l;
    }
}

` 代码给出错误的ans的情况:

A: 71045970
B : 41535484
C : 64735492  
My Output: 12942068
Actual Output:20805472

1 个答案:

答案 0 :(得分:0)

以下是您的简化版本。

int pow(int x, int n, int d) {
    long long l;
    if(n==0)
    {
        return 1;
    }
    if(n%2==0)
    {
        l = (long long)pow(x,n/2,d);
        return (int)((l * l) % (long long)d);
    }
    else
    {
        //check negative value of x, and make it positive, so that negative values never come in result
        if (x < 0) {
            x += d;
        }
        return (int)(((long long)x * (long long)pow(x,n-1,d)) % (long long)d);
    }
}

我认为您的代码在逻辑上是正确的,但如果模int值足够大,则d数据类型存在数据溢出问题。

例如。 (pow(x,n/2,d))*(pow((x),n/2,d))这里两个大的int值乘法会导致数据类型溢出。