1 条题解
-
0
自动搬运
来自洛谷,原作者为

BotDand
AFO搬运于
2025-08-24 21:07:35,当前版本为作者最后更新于2021-07-03 21:06:28,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
两个质数的和是 ,它们的积最大是多少?
可以考虑先确定一个质数 ,则另一个质数为 。
考虑如何判断质数。
首先要知道什么是质数。
质数是指在大于 的自然数中,除了 和它本身以外不再有其他因数的自然数。(摘自百度百科)
那么可以打出代码:
bool check(int n) { for(int i=2;i<=n;++i)//从2枚举到n if(n%i==0)//如果有n的因数 return false;//则不是质数 return true;//是质数 }但是这样的方法不够优,复杂度为,会超时。
考虑优化复杂度。
当 时, 的因子为 ,可将 的因子分为两类, 和 ,不难看出前者小于 ,后者大于 ,而通过前者即可算出后者,所以只需枚举前者,而前者小于 ,复杂度降为 。( 即为 的根号,如 约为 , 约为 )
但是当 时呢?
的因子为 ,怎么分配?
不妨加一个因子 ,即可分为两组: 和 ,问题解决。
即可打出代码:
bool check(int n) { for(int i=2;i*i<=n;++i)//从2枚举到√n if(n%i==0)//如果有n的因数 return false;//则不是质数 return true;//是质数 }最后枚举其中一个质数即可,时间复杂度 。
哦对还要特判 是否为 或 ,因为 不是质数,但循环不会运行,会返回 。
#include<bits/stdc++.h> using namespace std; int S; int ma; bool check(int n) { if(n<2) return false;//特判0,1 for(int i=2;i*i<=n;++i) if(n%i==0) return false; return true; } int main() { cin>>S; for(int i=1;i<=S;++i) if(check(i)) if(check(S-i)) if(i*(S-i)>ma)//找最大值 ma=i*(S-i); cout<<ma; return 0; }
- 1
信息
- ID
- 6991
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者