鱼C论坛

 找回密码
 立即注册
查看: 2093|回复: 5

[已解决]关于溢出的问题

[复制链接]
发表于 2018-1-30 23:42:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么在之后取模会溢出,而中途取模不会溢出呢?  num[i]在i等于某个值的时候已经大于了long long型最大值,那么后面的值不是溢出的值吗?为什么取余还能得到正确的结果呢?
#include <iostream>
using namespace std;

int main(){
    int n;
    cin>>n;
    long long num[100001];
    num[0]=0;
    num[1]=1;
    for(int i=2;i<=n;i++)
    {  
          num[i]=(num[i-1]+num[i-2]);
        num[i]=num[i]%1000000007;
    }
    cout<<num[i];
}
这里          num[i]=(num[i-1]+num[i-2]);
        num[i]=num[i]%1000000007;
        cout<<num[i]<<endl;

不会溢出,但改成:
num[i]=(num[i-1]+num[i-2]);
cout<<num[i]%100007
就会溢出,为什么呢?
最佳答案
2018-1-31 00:47:45
本帖最后由 boot 于 2018-1-31 00:52 编辑

溢出是要超过2的63次方-1(long long) 9223372036854775808这么大
1000000007比 2的63次方-1 小。

如果你 ”中途取模“
num[i]=num[i]%1000000007;  
就是让num[i]取模后又重新赋值给num[i]
可以说取模赋值后num[i]没有一个大于1000000007的
自然不会溢出,数都已经变小了,都不是斐波那契了,结果谈何正确呀

如果你 之后取模
cout<<num[i]%100007<<endl;
这里只是单纯取模,当num[i]超过2的63次方-1时,就溢出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-31 00:47:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 boot 于 2018-1-31 00:52 编辑

溢出是要超过2的63次方-1(long long) 9223372036854775808这么大
1000000007比 2的63次方-1 小。

如果你 ”中途取模“
num[i]=num[i]%1000000007;  
就是让num[i]取模后又重新赋值给num[i]
可以说取模赋值后num[i]没有一个大于1000000007的
自然不会溢出,数都已经变小了,都不是斐波那契了,结果谈何正确呀

如果你 之后取模
cout<<num[i]%100007<<endl;
这里只是单纯取模,当num[i]超过2的63次方-1时,就溢出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-31 10:15:47 | 显示全部楼层
num[i]=num[i]%1000000007;  表达式右边的num[i]不是到某一个值就会超过2的63次方-1吗?为什么不会溢出呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-31 10:16:19 | 显示全部楼层
boot 发表于 2018-1-31 00:47
溢出是要超过2的63次方-1(long long) 9223372036854775808这么大
1000000007比 2的63次方-1 小。

num[i]=num[i]%1000000007;  表达式右边的num[i]不是到某一个值就会超过2的63次方-1吗?为什么不会溢出呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 13:33:39 From FishC Mobile | 显示全部楼层
御笔剑客 发表于 2018-1-31 10:16
num=num%1000000007;  表达式右边的num不是到某一个值就会超过2的63次方-1吗?为什么不会溢出呢?

如果他超过2的63次方-1,肯定要先超过1000000007。在超过1000000007时,取模赋值后,就比1000000007要小了,就是说所有的num都比1000000007要小。就算num[i]前面两个数都是1000000006(这是假设,实际上不可能)想加赋值给num[i]也没超过 2的63次方-1,没溢位。
由于这两个数相差太大,不会出现前一个数没超过1000000007,下一个数直接超过 2的63次方-1 的情况哦。
不知道你明白了吗,我可能说的不是很好理解。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 19:54:18 | 显示全部楼层
还是我的IDE好 ^_^
无标题.png

是这个代码吧?
看一看 变量 i
出了for循环,变量 i 还存在吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 07:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表