鱼C论坛

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

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

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

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

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

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

  1. #include <iostream>
  2. using namespace std;

  3. int main(){
  4.     int n;
  5.     cin>>n;
  6.     long long num[100001];
  7.     num[0]=0;
  8.     num[1]=1;
  9.     for(int i=2;i<=n;i++)
  10.     {  
  11.           num[i]=(num[i-1]+num[i-2]);
  12.         num[i]=num[i]%1000000007;
  13.     }
  14.     cout<<num[i];
  15. }
复制代码

这里          num=(num[i-1]+num[i-2]);
        num=num%1000000007;
        cout<<num<<endl;

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

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

如果你 ”中途取模“
  1. num[i]=num[i]%1000000007;  
复制代码

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

如果你 之后取模
  1. cout<<num[i]%100007<<endl;
复制代码

这里只是单纯取模,当num超过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 小。

如果你 ”中途取模“
  1. num[i]=num[i]%1000000007;  
复制代码

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

如果你 之后取模
  1. cout<<num[i]%100007<<endl;
复制代码

这里只是单纯取模,当num超过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=num%1000000007;  表达式右边的num不是到某一个值就会超过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前面两个数都是1000000006(这是假设,实际上不可能)想加赋值给num也没超过 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-4-25 09:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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