算法竞赛刷题日记(2)

埃拉托斯特尼筛法(Sieve of Eratosthenes),简称埃氏筛,是一种由希腊数学家埃拉托斯特尼所提出的用于找出一定范围内所有素数的算法。这种筛法简单且历史悠久,其原理是从2开始,将每个素数的各个倍数标记为合数,从而在给定范围内筛选出所有的素数。

具体步骤如下:

  1. 列出2以后的所有自然数序列,例如:2, 3, 4, 5, 6, 7, ... , N(N为要筛选到的最大值)。

  2. 标出序列中的第一个素数,也就是2,然后从序列中删去2的倍数(除了2本身)。

  3. 接着寻找下一个未被删去的数,该数即为下一个素数。重复上一步,将此素数的倍数从序列中删去。

  4. 不断重复上述步骤,直到序列中所有小于等于最后一个标出素数的平方的数都被检查过。

  5. 序列中剩下的未被删去的数均为素数。

这种筛法的优点在于其简单性和有效性,能够快速地找出小于等于给定数值的所有素数。然而,它的缺点在于只能求解小于等于给定数值的素数;如果要求解大于给定数值的素数,则需要重新运行算法,这可能会比较耗时。

总的来说,埃拉托斯特尼筛法是一种简单而有效的素数筛选方法,适用于在给定范围内快速找出所有素数的情况。

题目描述 筛法: 说起质数,这是一个在我们小学就已经学会的概念,但是今天,已经上了初中的小虾仁又接触到了这个概念,老师让他们找出小于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
请按任意键继续. . .*/

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法训练营是一个专门为提升算法解题能力的训练营,而其中的《海量图解:竞赛刷题pdf》是一本有关竞赛刷题的电子书。这本书的特点是使用大量的图解来解释问题和解题思路。图解是一种直观且易于理解的表达方式,通过图示的方式展示算法问题的解决步骤,帮助读者更好地理解并掌握各种竞赛刷题中的算法思想和技巧。 这本电子书是为竞赛选手和算法学习者设计的,它集中介绍了各种算法题型,包括排序算法、查找算法、动态规划算法等等。每个算法问题都通过图解的方式进行了详细的解释,并附有相应的代码实现。图解的内容包括算法过程、数据流向、关键参数等等,帮助读者更加深入地理解算法的本质和实现原理。 《海量图解:竞赛刷题pdf》适用于各种水平的读者,无论是刚刚入门的初学者还是有一定算法基础的进阶者都可以通过这本书提升自己的算法能力。同时,该书内容丰富、详实,解题思路清晰,对于参加算法竞赛或是进行算法训练的读者来说,是一本很好的参考资料。 总之,《海量图解:竞赛刷题pdf》是一本通过大量图解来展示算法解题思路的电子书,它能够帮助读者更好地理解和掌握各种算法问题的解决方法,并提升算法解题的能力。无论是算法竞赛选手或是算法学习者,都可以从这本书中获得很大的收获。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值