题目描述
小 A 有一个质数口袋,里面可以装各个质数。他从 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。口袋的负载量就是口袋里的所有数字之和。但是口袋的承重量有限,不能装得下总和超过 L的质数。给出 L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。
输入格式
一行一个正整数L。
输出格式
将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。
输入输出样例
输入
100
输出
2 3 5 7 11 13 17 19 23 9
说明/提示
数据保证,1 <=L<=10^5
思路
求素数方法:
1.从2遍历到n被2到i除
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=2;i<=n;i++) //每次判断i是否为质数
{
int k;
for(k=2;k<i;k++)
{
if(i%k==0)
break;
}
if(k==i) //k==i说明没有执行过break
cout<<i<<endl;
}
return 0;
}
2.从3遍历到根下n
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
cout<<2<<endl;
for(int i=3;i<=n;i+=2) //每次判断i是否为质数
{
int k;
for(k=3;k<i;k+=2)
{
if(i%k==0)
break;
if(k*k>i)
break;
}
if(k*k>i) //k==i说明没有执行过break
cout<<i<<endl;
}
return 0;
}
3.筛法求n以内的素数 :
·把2-n中所有的数都列出来,然后从2开始,先划掉n内所有2的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其n内的所有倍数。最后剩下的数,就都是素数。
·空间换时间,加快了计算速度
·设置一个标志数组isPrime,isPrime[i]的值是1就表示i是素数,开始数组元素值全部为1
·划掉k的倍数,就是把isPrime[2*k],isPrime[3*k]...置成0
·输出为a[i]==1的数
#include<iostream>
using namespace std;
#define MAX_NUM 1000000
char isPrime[MAX_NUM+10];
int main()
{
for(int i=2;i<=MAX_NUM;++i) //将isPrime初始化为1
isPrime[i]=1;
for(int i=2;i<=MAX_NUM;i++) //如果没有被划去,继续进行
{
if(isPrime[i]) //倍数判断
for(int j=2*i;j<=MAX_NUM;j+=i)
isPrime[j]=0;
}
for(int i=2;i<=MAX_NUM;++i)
if(isPrime[i])
cout<<i<<endl;
return 0;
}
代码如下:
#include<iostream>
using namespace std;
int main()
{
int L;
cin>>L;
if(L>=2)
{
int sum=2;
cout<<2<<endl;
int m=1;
for(int i=3;sum<=L&&sum+i<=L;i+=2) //每次判断i是否为质数
{
int k;
for(k=3;k<i;k+=2)
{
if(i%k==0)
break;
if(k*k>i)
break;
}
if(k*k>i) //k==i说明没有执行过break
{
sum+=i;
cout<<i<<endl;
m++;
}
}
cout<<m;
}
else
cout<<0<<endl;
return 0;
}