Eratosthenes筛选法计算质数
《C和指针》第6章第4道编程题:
质数就是只能被1和本身整除的数。Eratosthenes筛选法是一种计算质数的有效方法。这个算法的第一步就是写下所有从2至某个上限之间的所有整数。在算法的剩余部分,遍历整个列表并剔除所有不是质数的整数。
后面的步骤是这样的。找到列表中的第1个不被剔除的数(也就是2),然后将列表后面所有逢双的数都剔除,因为它们都可以被2整除,因此不是质数。接着,再回到列表的头部重新开始,此时列表中第一个尚未被剔除的第1个数是3,所以在3之后把每逢第3个数(3的倍数)剔除。完成这一步之后,再回到列表开头,3后面的下一个数是4,但它是2的倍数,已经剔除,所以将其跳过,轮到5,将所有5的倍数剔除,这样依次类推、反复进行,最后列表中未被剔除的数均为质数。
编写一个程序,实现这个算法,使用数组表示列表。每个数组元素的值用于标记对应的数是否已被剔除。开始时数组所有元素的值都设置为TRUE,当算法要求“剔除”其对应的数时,就把这个元素设置为FALSE。如果你的程序运行于16位的机器上,小心考虑是不是把某个变量声明为long。一开始先使用包含1000个元素的数组。如果你使用字符数组,使用相同的空间,你将会比使用整数数组找到更多的质数。你可以使用下标来表示指向数组首元素和尾元素的指针,但你应该使用指针来访问数组元素。
除了2之外,所有的偶数都不是质数。数组中的元素只对应奇数可以使程序的空间效率大为提高。
/*
** 用Eratosthenes筛选法输出质数
*/
#include <stdio.h> void Eratosthenes( char *mark, int len ); int
main()
{
char mark[];
int i; /*
** 将数组所有元素设置成'1'
*/
for( i = ; i < ; ++i )
*( mark + i ) = ''; Eratosthenes( mark, ); /*
** 下标0对应的质数是2,直接输出
*/
printf( "%d ", );
int c = ; // c用来计算输出个数,控制每输出10个换行 for( i = ; i < ; ++ i )
{
if( *( mark + i ) == '' )
{
printf( "%d ", * i + ); // 数组中的元素只对应奇数,所以下标i对应2*i+1
c ++;
if( c % == )
printf( "\n" );
else
printf( " " );
}
} return ;
} /*
** Eratosthenes函数,筛选质数
*/
void
Eratosthenes( char *mark, int len )
{
int i, j;
for( i = ; i < len; ++ i )
{
if( *( mark + i) == '' )
{
for( j = i + ; j < len; ++ j )
{
// 把2*i+1的倍数剔除,即设置为'0'
if( ( * j + ) % ( * i + ) == )
*( mark + j ) = '';
}
}
}
}
Eratosthenes筛选法计算质数的更多相关文章
- Eratosthenes筛选法求解质数
问题说明: 除了自身之外,无法被其它整数整除的数称之为质数,要求质数很简单,但如何快速的求出质数则一直是程式设计人员与数学家努力的课题, 在这边介绍一个着名的 Eratosthenes求质数方法. 解 ...
- 每日一小练——Eratosthenes 筛选法
上得厅堂.下得厨房,写得代码.翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:Eratosthenes筛选法 内容: 求质数是一个非常普遍的问题,通常不外乎用数去除.除到不尽时,给定的数就是质数.可是 ...
- Eratosthenes筛选法构造1-n 素数表
筛选法:对于不超过n的每个非负整数p,删除2p,3p,4p...当处理完所有数之后,还没没删除的就是素数. 代码中进行了相应的优化. 本代码功能,输入一个数,输出从1-该数之间的素数.功能待完善,可将 ...
- Eratosthenes筛选法
说到素数,最基本的算是一百以内的那些数了.这些数在数学竟赛中常常会被用到.比如说有这样一道题:“一百以内有多少在加2后仍然是素数的素数?”11和17就是这样的素数.如果对素数很熟悉的话,就能迅速得出答 ...
- 算法笔记_012:埃拉托色尼筛选法(Java)
1 问题描述 Compute the Greatest Common Divisor of Two Integers using Sieve of Eratosthenes. 翻译:使用埃拉托色尼筛选 ...
- Java实现埃拉托色尼筛选法
1 问题描述 Compute the Greatest Common Divisor of Two Integers using Sieve of Eratosthenes. 翻译:使用埃拉托色尼筛选 ...
- [经典算法] Eratosthenes筛选求质数
题目说明: 除了自身之外,无法被其它整数整除的数称之为质数,要求质数很简单,但如何快速的求出质数则一直是程式设计人员与数学家努力的课题,在这边介绍一个著名的 Eratosthenes求质数方法. 题目 ...
- 使用埃拉托色尼筛选法(the Sieve of Eratosthenes)在一定范围内求素数及反素数(Emirp)
Programming 1.3 In this problem, you'll be asked to find all the prime numbers from 1 to 1000. Prime ...
- 筛选实现C++实现筛选法
每日一贴,今天的内容关键字为筛选实现 筛选法 分析: 筛选法又称筛法,是求不超越自然数N(N>1)的全部质数的一种方法.据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274-19 ...
随机推荐
- UVA 10791 Minimum Sum LCM
唯一分解定理 把n分解为 n=a1^p1*a2^p2*...的形式,易得每个ai^pi作为一个单独的整数最优. 坑: n==1 ans=2: n因子种数只有一个 ans++: 注意溢出 ...
- Learning Docker--chapter 1
CONTENTS: (1) An introduction to Docker (2) Docker on Linux (3) Differentiating between containeriza ...
- The Contiki build system 编译系统
The Contiki build system======================== The Contiki build system is designed to make it eas ...
- Send竞争对手:百度云一小时,QQ超大附件最多支持2G,邮件附件20M到50M不等(附国外所有storage列表)——痛点是,最大传输2G,最大容量只有3G(和微云不是一回事),转存到微云文件不能超过1G
QQ邮箱最大可发送50M普通附件(群邮件则限制在2M).此外也可以使用超大附件功能,支持将1G的文件发往任意邮箱.QQ邮箱根据你的QQ邮箱容量的不同制定相应的接受附件限制,包括附件在内,2G用户所发送 ...
- 【转】如何在ubuntu12.04设置adb驱动
原文网址:http://www.xuebuyuan.com/1475698.html 在ubuntu上adb驱动不用像在windows上一样需要额外装,只需要写一个配置文件就可以,下面是设置的步骤: ...
- 【转】Linux系统调用列表
一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtablesize 进程所能打开的最 ...
- 平时的笔记02:处理mp3
#! /usr/bin/env python # # mutagen aims to be an all purpose media tagging library # Copyright (C) 2 ...
- ios block使用
BlockTest.h #import <Foundation/Foundation.h> typedef void (^didFinishBlock)(NSString *str); t ...
- ASIFormDataRequest 上传图片
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- CSU 1808 地铁
题意: ICPCCamp 有 n 个地铁站,用 1,2,-,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i 段地铁属于 ci 号线,位于站 ai,bi 之间,往返均需要花费 ti 分钟 ...