求助P1990覆盖墙壁题,两组代码基本一致偏偏结果不一样
  • 板块学术版
  • 楼主CasualJ
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/8/17 11:35
  • 上次更新2023/10/27 15:00:29
查看原帖
求助P1990覆盖墙壁题,两组代码基本一致偏偏结果不一样
764625
CasualJ楼主2022/8/17 11:35

首先这个是我写的代码,正确输入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;

结果又能正常输出了,为什么啊,希望大佬解答,明明两个代码长得都一样啊。

2022/8/17 11:35
加载中...