【算法】试除法求素数

判定一个数是否为素数(只能被1和本身整除)通常用小于这个数的所有数去试除他,看是否能被整除,显然不够简便。

优化:
  1. 除了2以外,其他偶数全都不为素数(能被2整除),所以除了2以外只需要判断奇数是否为素数

  2. 若要判断一个数n,不需要试除到n-1或者n/2,只需要到sqrt(n),
    因为一个数若有因数,一个大于sqrt(n)一个小于sqrt(n)或者两者都为sqrt(n)

  3. 一个数的独特因数一定为素数,可以将之前算出的素数保存,用于之后的判断

(1.3优化平级)

代码实现(只给出了函数,未写主函数):

优化:1.2
用于判断一个数是否为素数

int isprime(int n)
{
	int i = 0, end = sqrt(n);
	if( n == 2)
		return 1;
	if(n % 2 == 0)
		return 0;
	for(i = 3; i <= end; i += 2)
	{
		if(n % i == 0)
			return 0; 
	}
	return 1;
} 

优化:1.2.3
用于输出n以内的所有素数
需要在顺序遍历,将每个找到的素数存到数组内

int arr[max]={2,3,5};
int func(int n)
{
    int j, m = 3, i = 2, end;
    for( ; ; )
    {
        m += 2;              //2是素数,偶数都是非素数,奇数加2仍为奇数  
        end = sqrt(m);
        for(j = 1; arr[j] <= end; j++)
        {
            if(m % arr[j] == 0)
                break;
        }
        if(end < arr[j])
        {
            arr[i++] = m;
        }
        if(fabs(m-n) <= 1)
            break;
    }
    for(j = 0; j < i ; j++)
    printf("%d ", arr[j]);
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值