/*************************************************************************************
*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;
}
素数的查找
最新推荐文章于 2024-03-26 08:59:08 发布