题解 B2134 【质数的和与积】

BotDand

·

2021-07-03 21:06:28

·

题解

\text{Problems}

两个质数的和是 S,它们的积最大是多少?

\text{Answer}

可以考虑先确定一个质数 x,则另一个质数为 (S-x)。

考虑如何判断质数。

首先要知道什么是质数。

质数是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。(摘自百度百科)

那么可以打出代码:

bool check(int n)

{

for(int i=2;i<=n;++i)//从2枚举到n

if(n%i==0)//如果有n的因数

return false;//则不是质数

return true;//是质数

}

但是这样的方法不够优,复杂度为\Theta (S),会超时。

考虑优化复杂度。

当 S=8 时,S 的因子为 1,2,4,8,可将 S 的因子分为两类,1,2 和 4,8,不难看出前者小于 \sqrt{S},后者大于 \sqrt{S},而通过前者即可算出后者,所以只需枚举前者,而前者小于 \sqrt{S},复杂度降为 \Theta (\sqrt{S})。(\sqrt{S} 即为 S 的根号,如 \sqrt{2}约为 1.414,\sqrt{3} 约为 1.732)

但是当 S=9 时呢?

不妨加一个因子 $3$,即可分为两组:$1,3$ 和 $3,9$,问题解决。

即可打出代码:

```cpp

bool check(int n)

{

for(int i=2;i*i<=n;++i)//从2枚举到√n

if(n%i==0)//如果有n的因数

return false;//则不是质数

return true;//是质数

}

```

最后枚举其中一个质数即可,时间复杂度 $\Theta (S\sqrt{S})$。

哦对还要特判 $S$ 是否为 $0$ 或 $1$,因为 $0,1$ 不是质数,但循环不会运行,会返回 $\texttt{True}$。

# $\text{Code}

#include

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<

return 0;

}