关于溢出的问题
为什么在之后取模会溢出,而中途取模不会溢出呢?num在i等于某个值的时候已经大于了long long型最大值,那么后面的值不是溢出的值吗?为什么取余还能得到正确的结果呢?#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
long long num;
num=0;
num=1;
for(int i=2;i<=n;i++)
{
num=(num+num);
num=num%1000000007;
}
cout<<num;
}
这里 num=(num+num);
num=num%1000000007;
cout<<num<<endl;
不会溢出,但改成:
num=(num+num);
cout<<num%100007
就会溢出,为什么呢?
本帖最后由 boot 于 2018-1-31 00:52 编辑
溢出是要超过2的63次方-1(long long) 9223372036854775808这么大
1000000007比 2的63次方-1 小。
如果你 ”中途取模“
num=num%1000000007;
就是让num取模后又重新赋值给num
可以说取模赋值后num没有一个大于1000000007的
自然不会溢出,数都已经变小了,都不是斐波那契了,结果谈何正确呀{:10_245:}
如果你 之后取模
cout<<num%100007<<endl;
这里只是单纯取模,当num超过2的63次方-1时,就溢出了
num=num%1000000007;表达式右边的num不是到某一个值就会超过2的63次方-1吗?为什么不会溢出呢? boot 发表于 2018-1-31 00:47
溢出是要超过2的63次方-1(long long) 9223372036854775808这么大
1000000007比 2的63次方-1 小。
num=num%1000000007;表达式右边的num不是到某一个值就会超过2的63次方-1吗?为什么不会溢出呢? 御笔剑客 发表于 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 的情况哦。
不知道你明白了吗,我可能说的不是很好理解。
{:10_245:} 还是我的IDE好 ^_^
是这个代码吧?
看一看 变量 i
出了for循环,变量 i 还存在吗?
页:
[1]