埃拉托斯特尼筛法(Sieve of Eratosthenes),简称埃氏筛,是一种由希腊数学家埃拉托斯特尼所提出的用于找出一定范围内所有素数的算法。这种筛法简单且历史悠久,其原理是从2开始,将每个素数的各个倍数标记为合数,从而在给定范围内筛选出所有的素数。
具体步骤如下:
-
列出2以后的所有自然数序列,例如:2, 3, 4, 5, 6, 7, ... , N(N为要筛选到的最大值)。
-
标出序列中的第一个素数,也就是2,然后从序列中删去2的倍数(除了2本身)。
-
接着寻找下一个未被删去的数,该数即为下一个素数。重复上一步,将此素数的倍数从序列中删去。
-
不断重复上述步骤,直到序列中所有小于等于最后一个标出素数的平方的数都被检查过。
-
序列中剩下的未被删去的数均为素数。
这种筛法的优点在于其简单性和有效性,能够快速地找出小于等于给定数值的所有素数。然而,它的缺点在于只能求解小于等于给定数值的素数;如果要求解大于给定数值的素数,则需要重新运行算法,这可能会比较耗时。
总的来说,埃拉托斯特尼筛法是一种简单而有效的素数筛选方法,适用于在给定范围内快速找出所有素数的情况。
题目描述 筛法: 说起质数,这是一个在我们小学就已经学会的概念,但是今天,已经上了初中的小虾仁又接触到了这个概念,老师让他们找出小于n的质数一共有多少个,小虾仁说:"这不是没什么区别嘛!" 在大家的瞩目下,小虾仁很快的就解决了问题,那么现在,我们想知道小于n的质数一共有多少个呢
注意:数组范围过大需要定义在主函数外面 0<=n<=2*10^6
输入 一个数字n
输出 小于n的质数个数
样例输入 Copy 2
样例输出 Copy 0
提示 0<=n<=2*10^6
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 2000000 + 10; // 根据题目要求定义数组范围
vector<bool> isPrime(MAXN, true); // 初始化所有数为质数
int main() {
int n;
cin >> n;
int count = 0; // 用于计数质数的个数
for (int i = 2; i < n; ++i) {
if (isPrime[i]) {
++count; // 发现质数,计数增加
// 将i的所有倍数标记为非质数
for (int j = i + i; j < n; j += i) {
isPrime[j] = false;
}
}
}
cout << count << endl; // 输出质数的个数
return 0;
}
2.蛇形矩阵
#include <stdio.h>
int main()
{
int n;
int a[50][50];
scanf("%d",&n);
int k=1;
for(int i=0;i<n/2;i++)
{
for(int j=i;j<n-1-i;j++)
a[i][j]=k++;
for(int j=i;j<n-1-i;j++)
a[j][n-1-i]=k++;
for(int j=n-1-i;j>i;j--)
a[n-1-i][j]=k++;
for(int j=n-i-1;j>i;j--)
a[j][i]=k++;
}
if(n%2==1)
a[n/2][n/2]=n*n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
}
/*5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
--------------------------------
Process exited after 1.168 seconds with return value 0
请按任意键继续. . .*/
/*6
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
--------------------------------
Process exited after 2.834 seconds with return value 0
请按任意键继续. . .*/