题目描述
小 A 有一个质数口袋,里面可以装各个质数。
他从2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。
口袋的负载量就是口袋里的所有数字之和。
但是口袋的承重量有限,装的质数的和不能超过L。
给出L,请问口袋里能装下几个质数?
将这些质数从小往大输出,然后输出最多能装下的质数的个数,数字之间用换行隔开。
输入格式
一行一个正整数L。
输出格式
将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。
输入输出样例
输入 1
100
输出 1
2 3 5 7 11 13 17 19 23 9
输入 2
5
输出 2
2 3 2
输入 3
11
输出 3
2 3 5 3
本题重点在于判断质数,初学者都会先想到暴力筛选质数。
#include<stdio.h>
int isprime(int n) //暴力筛选质数
{
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
return 0;
}
return 1;
}
int main()
{
int l = 0;
scanf("%d", &l);
int sum = 0; //计算质数和
int count = 0; //计算质数个数
for (int i = 2;; i++)
{
if (isprime(i))
{
sum += i;
if (sum > l) //当质数和大于l时,退出循环
break;
printf("%d\n", i); //先判断质数和是否小于等于l,再选择输出
count++;
}
}
printf("%d\n", count);
return 0;
}
当然还有其他的方法,如埃氏筛法。
埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是由希腊数学家埃拉托斯特尼所提出的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。
#include<stdio.h>
int isprime(int n)
{
int prime[100001] = { 0 };
for (int i = 0; i < 100001; i++) //初始化所有数为质数
{
prime[i] = 1;
}
for (int i = 2; i * i < 100000; i++) //筛选质数
{
if (prime[i]) //如果该数为质数,后面将该数的倍数全部置为0
{
for (int j = i * i; j <= 100000; j += i)
prime[j] = 0;
}
}
return prime[n];
}
int main()
{
int l = 0;
scanf("%d", &l);
int sum = 0; //计算质数和
int count = 0; //计算质数个数
for (int i = 2;; i++)
{
if (isprime(i))
{
sum += i;
if (sum > l) //当质数和大于l时,退出循环
break;
printf("%d\n", i); //先判断质数和是否小于等于l,再选择输出
count++;
}
}
printf("%d\n", count);
return 0;
}
筛选质数的方法还有很多,后面遇到再细说。