1 条题解
-
1
不是很简单的很简单的质数口袋问题
首先按照要求读入,之后我们需要一个函数,我们应该在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; }这是很简单的写法,但是也有个局限性:时间爆炸
那有没有办法优化呢?
答案是有的!我们只需要枚举到就够了
因为如果,那么和中一定有一个
所以写成
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就是口袋里最多能装下的质数个数了
信息
- ID
- 65
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 显示难度暂无评定
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者