首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我会得到一个负值?

为什么我会得到一个负值?
EN

Stack Overflow用户
提问于 2013-03-25 20:59:39
回答 3查看 213关注 0票数 0

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

代码语言:javascript
复制
#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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-26 12:43:30

带符号的long long的范围是-2^63到(2^63 - 1),最后一位用于存储符号。在你的例子中,当计算大数字的乘法时,你的结果将溢出,64位数字(存储符号)将得到值1(这意味着-ve值)。

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

Read this

票数 0
EN

Stack Overflow用户

发布于 2013-03-25 21:28:58

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

此外,你正在做一个挑战性的问题或家庭作业,这在Stack Overflow上已经讨论过无数次了,你可以通过搜索“1000000007”来看到。

票数 1
EN

Stack Overflow用户

发布于 2013-03-25 21:29:46

你需要小心使用(d*d*i)%MOD;,因为多个不带模的操作是不正确的,会在中考虑精度和溢出的风险。要严格地说对,你需要写

代码语言:javascript
复制
 return ((d*d)%MOD * i)%MOD;

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

编辑:我举个例子:

代码语言:javascript
复制
log2((MOD-1)x(MOD-1)x25) = log2(1000000006x1000000006x25) = 64.438

这意味着您将在计算过程中使用此输入溢出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15615577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档