首先这个是我写的代码,正确输入13后结果应该为13465,但是我的结果偏偏是377。
#include <iostream>
#define mod 10000;
using namespace std;
int g[1000020],f[1000020];
int main(){
int n;
cin >> n;
f[0] = 1,g[0] = 0,f[1]=g[1]=1;
for (int i = 2;i<=n;i++){
f[i]= (f[i-1] + f[i-2])%mod+2*g[i-2]%mod;
printf("f[%d] = %d = (%d+%d)mod + 2*%dmod\n",i,f[i],f[i-1],f[i-2],g[i-2]);
g[i] = (f[i-1]+g[i-1])%mod;
printf("f[%d] = %d = (%d+%d)mod + 2*%dmod\n",i,f[i],f[i-1],f[i-2],g[i-2]);
}
cout << f[n];
}
然后我找了一份和我基本一致的代码,又把里面的代码改的基本跟我一样,唯一区别只有空不空行。
#include<iostream>
using namespace std;
#define mod 10000
int g[1000020],f[1000020];
int main()
{
int n;
cin>>n;
f[0] = 1,g[0] = 0,f[1]=g[1]=1;
for(int i=2;i<=n;i++)
{
f[i]= (f[i-1] + f[i-2])%mod+2*g[i-2]%mod;
g[i] = (f[i-1]+g[i-1])%mod;
}
cout<<f[n];
//return 0;
}
但是这个代码长得基本跟我的代码一样跑起来结果却是正常的,打印的结果为13465。经过一段时间的搜索我发现了第12行
f[i]= (f[i-1] + f[i-2])%mod+2*g[i-2]%mod;
这一行一旦我把(f[i-1] + f[i-2])%mod的计算结果然后修改了代码的%mod删去,结果就是正常的,一旦我重新加回来结果又出现错误,而别人的代码就没这个问题,百思不得其解,我后面用了一个tmp变量存储了(f[i-1] + f[i-2])%mod的计算结果然后修改了代码
int tmp = (f[i-1] + f[i-2])%mod;
f[i]= tmp+2*g[i-2]%mod;
结果又能正常输出了,为什么啊,希望大佬解答,明明两个代码长得都一样啊。