我为什么得到负值?

时间:2013-03-25 12:59:39

标签: c

我的代码的幂函数存在一些错误,它为小值返回正确的答案但是对大值给出了错误的答案。

#include<stdio.h>
long long MOD= 1000000007;
long long power(long long i,long long j)
{
        if(j==0)
                return 1;
        long long d;
        d=power(i,j/(long long)2);
        if(j%2==0)
                return (d*d)%MOD;
        else
                return (d*d*i)%MOD;
}

int main()
{
        long long inv=1;
        inv=power(25,MOD-2)%MOD;
        printf("%lld\n",inv);
}

3 个答案:

答案 0 :(得分:1)

您的算法溢出了C实现中long long中可表示的值。

此外,您正在处理挑战问题或家庭作业,已经在Stack Overflow上多次讨论过,您可以通过搜索“1000000007”看到。

答案 1 :(得分:0)

您需要小心使用(d*d*i)%MOD;,因为没有模数的多个操作不正确, 需要精确度和帐户溢出风险 。要严格纠正,你需要写

 return ((d*d)%MOD * i)%MOD;

即使在这种情况下我也假设i == i%MOD

编辑:我举个例子:

log2((MOD-1)x(MOD-1)x25) = log2(1000000006x1000000006x25) = 64.438

这意味着您在使用此输入进行计算时会溢出。

答案 2 :(得分:0)

有符号长long的范围是-2 ^ 63到(2 ^ 63-1),最后一位用于存储符号。在你的情况下,当评估大数的乘法时,结果会溢出,第64位的数字(存储符号)将得到值1(这意味着-ve值)。

这就是你得到负值作为输出的原因。

Read this