求素数的优化算法

题目:求1~N范围中的素数。k为当前数值,j为被除数
素数:一个大于1的自然数中,除了1和本身外无法整除其余数的数值。

  1. 对于素数,可以忽略双数部分,因为均能被2整除,2也是素数做特殊情况,直接输出,即除去双数的可能,数据减少一半,即执行效率要提高一倍,k初始化为3,k=k+2。
  2. 因为k只可能为单数,所有被除数可忽略双数,被除数 j 初始化为3,每次 j += 2。
  3. 对于判断, 因为不是质数,那么一定可以表示成两个数(除了1和它本身)相乘,这两个数必然有一个小于等于它的平方根。只要找到小于或等于的那个就行了,用当前数值从3开始至当前数值的开根范围的数求余数,运行效率再次提高。
  4. 对于余数不等于0且 j 小于当前数值的开根值的情况,循环执行被除数 j += 2,若被除数 j 大于开根植,则当前数值为素数。
  5. 对于余数==0的情况,表示不是素数。

具体实现代码:

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

void get_prime(char *s)
{
	int N = atoi(s);
	int j = 3;
	double k = 3.0;
	int n = 1;
	//2为特殊的素数
	printf("%d\t",2);
	//从3开始到N,依次找出素数
	while((int)k < N)
	{
		j = 3;
		//被除数小于当前数值的开根,且不能整数的情况
		while( j < sqrt(k) && ((int)k % j != 0) )
		{
			j += 2;//k不等于双数,被除数也可忽略双数部分数值
		}
		//如果一直到j大于开根值都不能整除则为素数
		if( j >= sqrt(k) )
		{
			printf("%d\t", (int)k);
			n++;
			if(n%5 == 0)
				printf("\n");
		}
		k += 2;
	}
	printf("\n");
}

int main(int argc, char **argv)
{
	printf("求1~%s的素数:\n",argv[1]);
	get_prime(argv[1]);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值