c新手一直卡在80分求大佬指出错误

P1304 哥德巴赫猜想

@[reze97](/user/937961) To be honest,错的有点离谱[捂脸]
by Ifyoung @ 2023-02-04 07:48:48


@[reze97](/user/937961) 既然已经判定了N>4为什么还要输出"4=2+2"呢? 还有就是"i"为什么要从"3"开始枚举呢?
by Ifyoung @ 2023-02-04 07:52:15


@[reze97](/user/937961) 其实也不用判断N与4的关系,数据范围比较小,直接枚举即可
by Ifyoung @ 2023-02-04 07:53:03


@[reze97](/user/937961) ifz函数也有点问题,是用来判断质数的吗?为什么"a<9"就返回1呢?
by Ifyoung @ 2023-02-04 07:58:52


@[reze97](/user/937961) 改完之后是这样的: ```cpp #include<iostream> using namespace std; bool vis[10086]; bool ifz(int a) { for (int i = 2; i * i <= a; i += 1) //判断是否为质数 if (a % i == 0) return 0; //合数返回0(或false) return 1; //质数返回1(或true) } void ad() { int N; cin >> N; for(int i=4;i<=N;i+=2){ //从4开始拆分,每次+2(都是正偶数) for(int j=2;j<=i/2;j++){ //枚举第一个质数,只用枚举一半就行(加法具有交换律) if(ifz(j)==1&&ifz(i-j)==1&&vis[i]==0){ //如果两个加数都是质数并且这个偶数没有被记录过 printf("%d=%d+%d\n",i,j,i-j); //输出,不会printf的话就改成"cout<<i<<"="<<j<<"+"<<i-j<<endl;" vis[i]=1; //标记一下,这个数被访问(记录)过了 } } } return ; //表示结束 } int main() { ad(); return 0; } ```
by Ifyoung @ 2023-02-04 08:07:50


@[reze97](/user/937961) 下回要注意码风哦
by Ifyoung @ 2023-02-04 08:09:12


@[Ifyoung](/user/745434) 我想的是 N为一个>=4的正偶数,分解成两个质数的话,每个质数都是奇数(但是"4=2+2"是例外所以在函数一开始就判断如果传进去的N=4的话返回"4=2+2"),所以直接从3开始每次循环加2,这么做是为了使运算速度加快。 如果N>4且N为偶数的话就判断N是否能分解成两个质数,如果能 就创建一个 m=N 再让 N=4 并且打印"4=2+2"。然后开始循环判断并且打印,每次循环前都使 N+=2 然后判断N是否能分解成两个质数 能的话就打印 N=i+j,一直到m=N。 判断质数的函数ifz()里面的a<9是因为传进去的数一定为奇数,3 5 7都为质数。一开始设置的除数 i=3 并且每次循环都会 i+=2。但是呢 由于我一直找不出问题 就改成了 i=2 每次循环都会 i+=1。 那代码我运行后发现打印N=100出来的与答案提供的代码打印出来的一样 可是无论我怎么改都是80分。找了好久也找不出问题,不知道是不是算法的问题导致找出来的质数不是最小值。
by reze97 @ 2023-02-04 15:27:17


@[reze97](/user/937961) 思路还是冗余了,下回还是要换个简单个思路(毕竟就是道红题)
by Ifyoung @ 2023-02-04 15:53:36


@[reze97](/user/937961) 至于你的思路。。。有点不好理解
by Ifyoung @ 2023-02-04 15:54:34


@[Ifyoung](/user/745434) 因为不是说要先判断N是否可以分解成两个质数吗,能分解成的话再打印。我刚刚把一开始 判断传进去的N是否为质数的那段代码删除了就100分了,终于过了唉。谢谢你的帮助,不知道这个分数是怎么样评估的,写的详细了反而还过不了。
by reze97 @ 2023-02-04 16:00:51


| 下一页