题目描述
狮子座很爱学习,最近沉迷于研究素数,一天他发现了一个很神奇的数,叫做几乎素数。定义如下:如果一个数字恰好具有两个不同的素数除数,则称为几乎素数。 例如,数字6、18、24是几乎素数,而数字4、8、9、42不是。 请你帮忙找出介于1和n之间(含1和n)的几乎素数的数量。
输入
输入包含一个整数n(1≤n≤3000)
输出
输出1到n之间(含1和n)的几乎素数的数量。
样例输入 Copy
10
样例输出 Copy
2
思路:利用埃氏筛选素数思想,首先打表,素数不会被标记,每个素数的倍数都会被标记一次,所以按照题目的意思,我们只需要找到被标记两次的数,那么这个数就是几乎素数
埃氏筛应该是算是一种简单编写,容易理解的筛选素数的方法了
点我了解埃氏筛
#include <bits/stdc++.h>
using namespace std;
int num[3005];
int main()
{
int n;
for (int i = 2; i < 3005; ++i)
if (!num[i])//如果没有标记过
{
for (int j = 2 * i; j < 3005; j += i)//如果是素数的倍数就标记一次
num[j]++;
}
while (cin >> n)
{
int s = 0;
for (int i = 2; i <= n; ++i)
if (num[i] == 2)//如果有两个不同素数的因子
s++;
cout << s << endl;
}
return 0;
}
路漫漫其修远兮,吾将上下而求索。 |
---|