1 条题解

  • 1
    @ 2026-9-23 20:59:57

    其实是一个结论题

    我们都知道可以通过暴力枚举每一个小于n的数并判断是否是质数

    如果我们从n开始,倒着遍历,是不是就能成功找到,第一个出现的,能被n整除的,而且是质数的数?

    然而……时间复杂度爆炸了

    #include<iostream>
    using namespace std;
    bool isprime(int x){
        if(x<2) return false;
        if(x==2) return true;
        for(int i=2;i<=x/i;i++){
            if(x%i==0) return false;
        }
        return true;
    }
    int main(){
        int n;
        cin>>n;
        for(int i=n;i>=2;i--){
            if(n%i==0&&isprime(i)) {cout<<i;return 0;}
        }
        return 0;
    }
    

    所以必须探索更高效的办法……或许我们不用判断质数?

    如果我们从2开始,直到n结束?

    题目中保证n不是质数,而且如果我们去寻找n的所有因数,其实不难发现因数是成对出现的

    n=21 n的因数:1,3,7,21

    那这就告诉我们,如果我们能找到一个能被n整除的数,是不是说明前边没用任何能够被n整除的数?

    那是不是说,相应的,另一个数,也可以被n整除?

    那么那个数,是不是就是最大的?

    #include<iostream>
    using namespace std;
    int main(){
        int n;
        cin>>n;
        for(int i=2;i<=n;i++){
            if(n%i==0) {cout<<n/i;return 0;}
        }
        return 0;
    }
    

    【深基7.习3】[NOIP2012 普及组] 质因数分解

    信息

    ID
    13
    时间
    1000ms
    内存
    256MiB
    难度
    显示难度暂无评定
    标签
    递交数
    2
    已通过
    1
    上传者