1 条题解

  • 0
    @ 2025-8-24 21:07:36

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar BotDand
    AFO

    搬运于2025-08-24 21:07:35,当前版本为作者最后更新于2021-07-03 21:06:28,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Problems\text{Problems}

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

    Answer\text{Answer}

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

    考虑如何判断质数。

    首先要知道什么是质数。

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

    那么可以打出代码:

    bool check(int n)
    {
        for(int i=2;i<=n;++i)//从2枚举到n
            if(n%i==0)//如果有n的因数
              return false;//则不是质数
        return true;//是质数
    }
    

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

    考虑优化复杂度。

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

    但是当 S=9S=9 时呢?

    99 的因子为 1,3,91,3,9,怎么分配?

    不妨加一个因子 33,即可分为两组:1,31,33,93,9,问题解决。

    即可打出代码:

    bool check(int n)
    {
        for(int i=2;i*i<=n;++i)//从2枚举到√n
            if(n%i==0)//如果有n的因数
              return false;//则不是质数
        return true;//是质数
    }
    

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

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

    Code\text{Code}

    #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
    上传者