嗯...
这或许也算一道数论题吧...
题目链接:https://www.luogu.org/problemnew/show/P1579
这道题的说明好像只会扰乱人的思路....然后就是这道题的细节比较多...
首先做的时候总是50分、70分...
然后发现有两个细节:
1、j不能从i开始循环,而要从2开始循环
2、k不一定是一个正数,所以要加一层判定(n == 97)
思路:
读入------>欧拉筛判质数------>暴力枚举------->判断输出
AC代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 4 using namespace std; 5 6 7 const int maxn = 20005; 8 int n, cnt; 9 int prime[maxn], vis[maxn], pp[maxn];10 inline void is_prime(){11 for(int i = 2; i <= n; i++){12 if(!vis[i]) prime[++cnt] = i, pp[i] = 1;13 for(int j = 1; j <= cnt && i * prime[j] <= n; j++){14 vis[i * prime[j]] = 1;15 if(i % prime[j] == 0) break;16 }17 }18 }19 20 int main(){21 scanf("%d", &n);22 is_prime();23 for(int i = 2; i <= n; i++){24 for(int j = 2; j <= n; j++){25 //for(int j = i; j <= n; j++)26 int k = n - i - j;27 if(k >= 2){ //9728 if(!vis[i] && !vis[j] && !vis[k]){29 printf("%d %d %d", i, j, k);30 return 0;31 } 32 }33 }34 }35 return 0;36 }