1 条题解

  • 1
    @ 2026-9-18 21:48:55

    不是很简单的很简单的质数口袋问题

    首先按照要求读入LL,之后我们需要一个boolbool函数,我们应该在bool中书写判断质数

    有一种写法是对于n,暴力枚举所有的小于n的数,而且保证这个数大于1;如果有一个数能够整除n,那就说明n不是质数

    bool isprime(int n){
      if(n<2) return false;
      if(n==2) return true;
      for(int i=2;i<=n;i++){
        if(n%i==0) return false;
      }
      return true;
    }
    

    这是很简单的写法,但是也有个局限性:时间爆炸

    那有没有办法优化呢?

    答案是有的!我们只需要枚举到n\sqrt{n}就够了

    因为如果n=a×bn=a \times b,那么aa和bb中一定有一个≤n\leq \sqrt{n}

    所以写成i <= n / i就可以了(避免浮点运算)

    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;
    }
    

    接下来就是主函数的逻辑了

    我们从2开始依次枚举自然数,如果是质数就尝试装进口袋

    但是要注意:装之前要判断sum + i <= L,超过承重就不能装了

    int main(){
        int l;
        cin>>l;
        int sum=0,cnt=0;
        for(int i=2;sum+i<=l;i++){
            if(isprime(i)){
                sum+=i;
                cnt++;
                cout<<i<<'\n';
            }
        }
        cout<<cnt;
        return 0;
    }
    

    循环条件sum + i <= l的意思是:当前总和加上这个质数不能超过L

    如果超过了,循环直接终止,保证口袋不会超重

    最后输出cnt就是口袋里最多能装下的质数个数了

    • 1

    信息

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