素数判定试除法

质数的定义

一个数,如果只有1和它本身两个因数,这样的数叫做质数,又称素数。

试除判断法

算法描述:从上述定义可知,素数不能被1和它本身之外的数整除,所以,判断一个数x是否素数只要看它是否能被2~sqrt(x)间的数整除即可;而求N内所有素数则是循环重复上述过程。

C语言实现

优化分析


  1. 在循环条件中重复调用sqrt(i)显然是比较浪费时间的
  2. 判断素数,真的需要拿2~sqrt(i)间的所有整数去除吗?我们知道,合数都可以分解成若干质数,所以只要2~sqrt(i)间的质数不能整除i即可

根据上面两点,我们可将SimpleDivisionV1升级为SimpleDivisionV2,如下

 // 简单试除判断法 Ver2 
int SimpleDivisionV2(int n)
{
int i, j, k, stop;
// 素数数量统计
int count = 0;
// 分配存放结果的空间
int* primes = (int*)malloc( sizeof(int)*n );

// 2是素数谁都知道,不算了
primes[count++] = 2;
stop = count;
// 循环计算3~n间的数
for (i=3; i<=n; i++)
{
   k = sqrt(i);
   // 在循环条件中重复调用sqrt是低效做法,故引入k
   while (primes[stop] <= k && stop < count)
    stop++;
   // stop干什么用,思考一下
   for (j=0; j<stop; j++)
   {
    if (i%primes[j] == 0) break;
   }
   // i不能被2~sqrt(i)间的素数整除,自然也不能被其他数整除,素数也
   if (j == stop)
   {
    primes[count++] = i;
   }
}

// 因输出费时,且和算法核心相关不大,故略

// 释放内存,别忘了传说中的内存泄漏
free(primes);

return count;
}
void main()
{
int count;
clock_t start, end;
// time函数不够精确,用clock凑合一下吧
start = clock();
count = SimpleDivisionV1(N);

end = clock();
printf("[%d]以内素数个数:%d, 计算用时:%d毫秒\n", N, count, end-start);
getch();
}

然后将main中调用的函数替换为SimpleDivisionV2,在看一下执行结果:

[100000]以内素数个数:9592, 计算用时:46毫秒
[1000000]以内素数个数:78498, 计算用时:546毫秒
[5000000]以内素数个数:348513, 计算用时:3515毫秒
[10000000]以内素数个数:664579, 计算用时:8000毫秒


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值