判断一个整数是否为素数
来源:互联网 发布:天津市教育信息化软件 编辑:程序博客网 时间:2024/05/16 18:11
问题:给定一个正整数,如何判断它是否为素数?
素数,又称之为质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数被称为素数。
func challenge(number: Int) -> Bool { // 只有当输入的整数是大于等于2时,题目才有意义 guard number >= 2 else { return false } // 遍历从[2, number)之间所有的正整数 for i in 2 ..< number { // 如果number能被i整除 if number % i == 0 { // 就说明number不是素数,返回false return false } } // 说明number是素数,返回true return true}
上面的算法肯定是对的,但是它还不够完美。我们都知道,自然界中的素数有无穷个,当一个数接近无穷大时,你可能要把从2到接近正无穷大的正整数都除以一遍,这个耗时将是难以忍受的。因此,我们要改进上面的算法。
我们可以这样考虑:假设一个正整数n不是素数,那么肯定存在这样两个正整数x和y,使得n = x * y成立。再假设x和y都大于n的平方根,那么x * y > n肯定是成立的,但实际上这又是不可能的。所以,我们可以确定,x和y中至少有一个数,它是小于或者等于n的平方根的。
上面这个结论有没有卵用呢?当然是有的,我们可以利用它大幅减少计算步骤。以素数143为例,它开平方然后向上取整,得到整数12,假设143不是素数的话,利用上面的结论可知,它肯定存在一个因子是小于或者等于12的,所以我们只需要在[2, 12)这个区间去搜索结果就可以了。用代码表示为:
func challenge1(number: Int) -> Bool { guard number >= 2 else { return false } // 把整数2排除 guard number != 2 else { return true } // ceil(_: )向上取整,sqrt(_: )返回非负的平方根 let max = Int(ceil(sqrt(Double(number)))) // 除数只需要从2取到max就可以了 for i in 2 ... max { // 如果能被i整除 if number % i == 0 { // 则说明它不是素数,直接返回false return false } } return true}
这个方案和第一个比较起来,已经大幅减少了计算开销,是一个比较合理的算法。代码中用到了两个C语言标准库函数ceil(_: )
和sqrt(_: )
,它们分别表示向上取整函数和开平方根函数。
阅读全文
0 0
- 判断一个整数是否为素数
- 判断一个整数是否为素数
- 输入一个整数,判断其是否为素数
- 判断一个整数是否为素数(或称为质数)
- 编写函数判断一个整数是否为素数
- 经典算法之判断一个整数是否为素数
- 判断任意一个整数是否素数
- 判断任意一个整数是否素数
- 写一个函数:给定一个整数N, 判断N是否为素数.
- 判断一个数是否为一个素数
- C语言基础函数 判断一个整数是否为素数,质数
- 建立一个类Prime,用来判断某整数是否为素数。具体要求如下:
- 判断一个数是否为素数(函数)
- 如何判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 判断一个数是否为素数
- 如何逆转一个字符串
- 逻辑分支和嵌套三目运算
- 在一定范围内生成随机数
- 自己写一个pow()函数
- 交换两个数
- 判断一个整数是否为素数
- 求平方根或近似平方根
- 从文件中读取字符串
- Swift中栈的实现
- Swift中队列的实现
- Swift 4新特性研究
- mysql事务隔离级别
- mysql的锁
- python统计序列中元素出现的频率