C++程序 检查一个数是否为质数
给定一个正整数N。任务是编写一个C++程序来检查这个数是不是 质数 。
定义 :
质数 是一个大于1的自然数,除了1和本身之外没有其他正约数。前几个质数是{2,3,5,7,11 ……}。
解决这个问题的思路是使用for循环从2到sqrt(N)遍历所有数字,并且针对每个数字检查它是否可以整除N。如果我们找到任何可以整除N的数字,就返回false。如果我们在2和sqrt(N)之间没有找到任何整除N的数字,那么它就意味着N是质数,我们将返回True。
为什么我们选择sqrt(N)?
原因是一个数的最小约数和大于一的约数都不可能超过N的平方根。并且当我们找到一种因子时就停止。例如,如果N是49,则最小因子是7。对于15而言,最小因子是3。
下面是检查一个数是否为质数的C++程序:
输出 :
时间复杂度: O(n 1/2 )
辅助空间: O(1)
方法2: 基于Wilsons定理的优化方法,复杂度为 O(N)
如果 ((n-1)!+1) % n == 0,则n是质数,否则它不是质数。
例如:
输入: 11
输出: 11是质数
解释: (11-1)! + 1 = 3628801
3628801 % 11 = 0
输入: 8
输出: 8不是质数
解释: (8-1)! + 1 = 5041
5041 % 8 = 1
上述方法的实现:
输出
时间复杂度: 只有计算(n-1)的阶乘并检查它是否为0或1的O(N)复杂度,使用%运算符只需要常数时间
辅助空间: O(1)