@[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