质数的判断(C)

质数的判断(C)

质数的定义及性质

定义

设N为大于1的任意整数,若N的因数只有1和N,则N称为质数。

性质

1.非2的偶数不是质数
2.所有大于10的质数个位数必然为1,3,7,9

更多性质 详见度娘:https://baike.baidu.com/item/%E8%B4%A8%E6%95%B0/263515?fr=aladdin
当然还有一些别的性质啦,比如什么6的附近咋样咋样的,这里因为我没用,所以就不介绍了。

分析

a: 2这个偶数是质数,如果我们想要不对所有偶数进行判断的话,则必须对2处理,处理之后我们可以使任意偶数不进入判断循环。您一路走好~

b: 利用质数的第2条性质,我们可以使大于10但个位数为5的所有数不进入循环。拜拜了您!个5

c: 在分析a中我们把所有偶数滤过了,能进循环的只能是奇数!而奇数的因数不可能有偶数,那我的为何还要循环去判断某一偶数是不是因数呢是吧?将循环初始条件为i=3,步长为2。哎打扰了呀,偶数判断再见!

d: 判断质数的因数时我们只需要判断到该数的开方就可以了。不多说,因为因数不甘孤独,都是成对出现的。我举个栗子:比如21,其因数对有(1,21)、(3,7)再如54,因数对有(1,54)、(2,27)、(3,18)、(6,9)。从来没有甘于孤独的因数,不信你再试试别的数。你再看看因数对中小的那个有没有超过判断目标的开方?没吧?所以我们判断到开方就行了。

C实现

int isPrimeNum(int x)      //返回值为1:质数      0:非质数
{
	
	if (x == 2) {              //处理2
		return 1;
	}
	if ((x % 2 == 0) || (x > 10 && x % 10 == 5)) {
		return 0;          //处理偶数及个5
	}
	else {
		for (int i = 3; i <= pow(x, 0.5); i += 2) {  //跳偶因数,上限为开方向下取整
			if (x % i == 0) {
				return 0;
				break;
			}
		}
	}
	return 1;
}

代码看着有点多,但效率还不错。对了,我没处理输入,假定输入一定是大于1的整数,你要是输入不符合这个规则的东西,辣我也没滴办法。你要是想提高逼格,可以加处理输入的代码。在这里插入图片描述

扩展

如果我们可以将判断得到的质数存入数组,我们还可以利用已知的质数去判断下一个数是不是质数,进一步提高判断效率,这个思想可以用在输出max以下所有质数这种情况。这里我用python实现以下:

import math
x = [2,3,5,7]   #10以内的质数
max = 100     #目标区间[1,max]
for i in range(11,max+1,2):  #大于10开始,只判奇数 
    if i%10 == 5:    #末位为5必不是质数
        continue
    for j in x:            
        if j > math.ceil(i**0.5):    #判到开方
            x.append(i)     
            break
        if not i%j:   #j是i的因数,跳出
            break
print(x)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值