打印素数表的四种方法

题目:给出一个正整数n,打印出所有从1~n的素数(即质数);

1.傻瓜解法

1     int i,n;
2   while(scanf("%d",&n)!=EOF)
3   {
4     for(i=2;i<n;i++)
5          if(n%i==0)    break;
6     if(i==n)    printf("YES\n");
7     else           printf("NO\n");
8     }
9  

这是理所当然的想法,按照素数的定义,除了1和它本身没有其他的因数,就是素数。

这种解法的缺点就是红色标注那里,这种循环规模n稍微大点,运行时间就会特别特别长。

2.普通解法--sqrt(n)

1   int i,n,x;
2   while(scanf("%d",&n)!=EOF)
3   {
4     x=(int)sqrt(n);
5     for(i=2;i<=x;i++)
6          if(n%i==0)    break;
7     if(i>x)    printf("YES\n");
8     else           printf("NO\n");
9     }

这里循环取到sqrt(n),效率改进不少了,但显然还是不够理想。

3.普通筛选法--埃拉托斯特尼筛法

关于埃拉托斯特尼筛法,维基百科上的GIF讲解和伪代码都特别清楚。

所用的原理大概是所使用的原理是从2开始,将每个素数的各个倍数,标记成合数。一个素数的各个倍数,是一个差为此素数本身的等差数列。此为这个筛法和试除法不同的关键之处,后者是以素数来测试每个待测数能否被整除。

实现方法:建立一个bool类型的数组check,一个int类型的数组prime储存素数,先假设所有的数都是素数(初始化为0),从第一个素数2开始,把2的倍数都标记为非素数(check置为1),一直到大于N;然后进行下一趟,找到2后面的下一个素数3,进行同样的处理,直到最后,数组中依然为0的数即为素数。

代码如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MAXN 100000
 4 #define MAXL 1000000
 5 _Bool check[MAXN];
 6 int prime[MAXL];
 7 int main(void)
 8 {
 9     int n,count;
10     while (~scanf("%d", &n))
11     {
12         count = 0;
13         memset(check, 0, sizeof(check));
14         for (int i = 2; i <= n; i++)
15         {
16             if (!check[i])
17                 prime[count++] = i;
18             for (int j = i + i; j <= n; j += i)
19                 check[j] = 1;
20         }
21         for (int i = 0; i < count; i++)
22             printf("%d\n", prime[i]);
23     }
24     return 0;
25 }

埃拉托斯特尼筛法虽然已经将时间复杂度降低到O(nloglogn),但是还是有不足之处。

因为6在i==2时就被标记了,而在i==3的时候又被标记了一次,所以还是有改进的空间。

4.线性筛选法——欧拉筛法

欧拉筛法通过红色标记部分保证每个合数只会被它的最小质因数筛去,时间复杂度降低到O(n)。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MAXN 100000
 4 #define MAXL 1000000
 5 int prime[MAXN];
 6 _Bool check[MAXL];
 7
 8 int main(void)
 9 {
10     int n, count;
11     while (~scanf("%d", &n))
12     {
13         memset(check, 0, sizeof(check));
14         count = 0;
15         for (int i = 2; i <= n; i++)
16         {
17             if (!check[i])
18                 prime[count++] = i;
19             for (int j = 0; j < count; j++)
20             {
21                 if (i*prime[j] > MAXL)
22                     break; // 过大的时候跳出
23                 check[i*prime[j]] = 1;
24                 if ((i%prime[j]) == 0) // 如果i是一个合数,而且i % prime[j] == 0
25                     break;
26             }
27         }
28         for (int i = 0; i < count; i++)
29             printf("%d\n", prime[i]);
30     }
31     return 0;
32 }

 

时间: 2024-10-10 20:33:36

打印素数表的四种方法的相关文章

数据库两表连接四种方法

一般我们连接两张表时,都是select xxx,xx from x1,x2 where x1.a=x2.a.其实数据库还有4中join操作. 例如:表1: student s_id name sex 1  张三  男 2  李四  女 4  王五  男 表2: class c_id  id  name 1 1 11111 2 2 22222 3 3 33333 4 2 44444 1.连接查询 select s.name s_name,s.sex s_sex,c.name c_name from

oracle增加表空间的四种方法,查询表空间使用情况

增加表空间大小的四种方法Meathod1:给表空间增加数据文件ALTER TABLESPACE app_data ADD DATAFILE'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP03.DBF' SIZE 50M; Meathod2:新增数据文件,并且允许数据文件自动增长ALTER TABLESPACE app_data ADD DATAFILE'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP04.DBF'

增加表空间大小的四种方法

增加表空间大小的四种方法Meathod1:给表空间增加数据文件ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP03.DBF' SIZE 50M;   Meathod2:新增数据文件,并且允许数据文件自动增长ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP04.

oracle增加表空间的四种方法

1. 查看所有表空间大小 select tablespace_name,sum(bytes)/1024/1024 from dba_data_files group by tablespace_name; 2. 未使用的表空间大小 select tablespace_name,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name; 3. 所以使用空间可以这样计算 select a.tablespace_name,tot

mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问题 [CSDN博客] mysql 主从复制 双主从复制原理 防止主键重复问题(必看) [CSDN博客] replace into导致mysql自增列导致主键重复问题分析 [CSDN博客] 一个循环更新某库所有表所有非主键列的值方法(sql 2005 & mysql) [CSDN博客] mysql i

自学Linux命令的四种方法

自学Linux命令的四种方法 导读 童鞋们刚接触linux时,在学习过程中中会遇到不少问题,学习linux摸不着头脑,那么下面介绍四种linux的学习方法,特别适合新手. 方法一:终端"每日提示" 在.bashrc中(/home/.bashrc)增加如下一行: echo "Did you know that:"; whatis$(ls /bin | shuf -n 1) 你只需要增加这行就够了!如果你想让它更娱乐化一些,你可以安装cowsay.Ubuntu/Debi

IOS中Json解析的四种方法

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的ios版本,可以使用第三方库来解析Json. 本文将介绍TouchJso

IOS开发之——四种方法解析Jason数据(转)

本文将介绍TouchJson. SBJson .JSONKit 和 iOS5所支持的原生的json方法,解析国家气象局API,TouchJson和SBJson需要下载他们的库 TouchJson包下载: http://download.csdn.net/detail/enuola/4523169 SBJson 包下载: http://download.csdn.net/detail/enuola/4523177 JSONKit包下载:http://download.csdn.net/detail

Spring Security3的四种方法概述

使用Spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过,并经过验证: 二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置,目前这种方式已经实现,并经过验证. 三种是细分角色和权限,并将用户.角色.权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器,     并分别实现Ac