素数的查找

本文介绍了一个高效的素数检测算法,并通过C语言实现。该算法利用了素数特性,仅需测试到根号x即可,提高了检测效率。文章还展示了如何遍历特定范围内的奇数来寻找所有素数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*************************************************************************************
*file:		Prime.c
*data:		2013/3/10
*description:
		(1)2是最小的素数,且是唯一的偶素数,故单独列出
		(2-被除数)偶数必然能够被2整除,因此被除数只判断奇数(2单独处理)
		(3-除数)由于被除数限制在奇数的范围内,故不可能被2整除,因此除数从3开始遍历。
				  除数的遍历从3开始,到sqrt(x)结束。因数都是成对出现的。比如,100的因
				  数有:1和100,2和50,4和25,5和20,10和10。成对的因数,其中一个必然
				  小于等于100的开平方,另一个大于等于100的开平方。
**************************************************************************************/

#include <stdio.h>
#include <math.h>
#include <windows.h>

#define	DATA_SIZE	10000	//测试DATA_SIZE以内的素数
#define BOOL	unsigned char
#define true	1
#define false	0

BOOL IsPrime(int x);

int main()
{
	int data; //被测试的数
	int count; //素数的个数
	DWORD	time_head; //程序开始时间

	time_head = GetTickCount();	//获取程序开始执行时的时间

	printf("************************ P r i m e ************************\n");
	printf("%5d",2); //由于2是最小的素数,且是唯一的偶素数,故单独列出

	//由于偶数不会是素数,故只遍历DATA_SIZE内的奇数
	for(data = 3,count = 1;data <= DATA_SIZE;)	
	{
		if(IsPrime(data) == true)	//判断data是否为素数
		{
			printf("%5d",data);
			count++;
			if((count % 8) == 0)	//每输出8个素数,换行,控制格式
			{
				printf("\n");	
			}
		}
		data += 2;	//修正被测数值
	}

	printf("\n\nThe total number of prime is %d",count);
	//打印程序运行时间,精确到毫秒
	printf("\nThe running time of program is %ld ms\n",GetTickCount() - time_head);
	printf("\n************************ O V E R ************************\n");

	return 0;
}


/*
 *判断参数x是否为素数
 *x是素数返回true
 *x不是素数返回false
 */
BOOL IsPrime(int x)
{
	int div;
	if(x < 2)
	{
		return false;
	}
	else if(x == 2)		//2是最小的素数,也是唯一的偶数素数
	{
		return true;
	}
	
	//由于只判断奇数,故不可能被2整除,i从3开始的奇数算起
	for(div = 3;div <= sqrt(x);div += 2)	//!!!参数i必须<=sqrt(x)!!!
	{
		if((x % div) == 0)
		{
			return false;
		}
	}
	return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值