1、判断一个数是否为质数(素数)
什么是质数?
概念:只能被1 和 它本身 整除的数叫做质数(素数)
所以,根据概念推导,能被除了 1 和 它本身 之外的数整除的数就不是质数。
所以只需要把这个数之前的数(除了1)都除一遍,不就可以啦。开写!
function _isPrime(num) {
for (var i = 2; i < num; i++) {
if (num % i == 0) {
return "不是质数";
}
}
//这行代码一定要写在for循环外面,如果放在里面,遇到像9这样的数字,就会把它判断成“是质数”
return "是质数"
}
- 代码说明:
- 由概念可得,首先要排除 1 和 该数本身 的干扰。所以for循环从2开始,到num -1 结束
2、判断一个数是否为质数-优化1
在我们会写代码之后,我们可以考虑优化一下这几行代码
-
优化代码可以从以下几个方面思考:
-
使用的算法,即是否存在更简单的算法,从而减少运算过程
-
观察for循环中声明的变量,是否可以拿到for循环外面,减少代码的运算次数
-
重复使用的语句可以封装到方法中,谁使用谁调用。
-
根据以上方面进行优化。代码如下:
function _Prime(num) {
var n = num / 2;
//优化:1.一个数最大的约数是他的一半
// 2.将除以二的操作放到循环外面,这样会减少计算
for (var i = 2; i <= n; i++) {
if (num % i == 0) {
return "不是质数";
}
}
return "是质数"
}
-
代码说明:
-
for循环的范围改为num 的一半
-
原理:每个数的最大的约数要么是这个数的一半,要么比该数的一半要小。
因为最小的约数是2,假设该数为a,另一个约数为x,那么2x > a,所以最大约数一定小于等于 a / 2.
-
3、判断一个数是否为质数-优化2
function _Prime(num) {
var n = Math.sqrt(num);
//优化:1.n 改为 根号num
// 2.将除以二的操作放到循环外面,这样会减少计算
for (var i = 2; i < n; i++) {
if (num % i == 0) {
return "不是质数";
}
}
return "是质数"
}
-
代码说明:
-
for循环的范围改为 (根号num)
-
原理:一个数的任意两个约数一定在该数开根号后的值的两边。
设一个数为x,两个约数分别为a,b,假设a <= (根号x),则 a / (根号x) <= 1;
a * b = x,两边同时除以 (根号x), 变成 a / (根号x) * b = (根号x)
两边同时除以b,得 a / (根号x) = (根号x) / b
所以 (根号x) / b <= 1,最终得 b >= (根号x)
-
4、输出2-100以内所有质数
如果以上代码搞明白的话,这个题不在话下。
function _PrimeArr() {
var arr = [];
for (var i = 2; i < 200; i++) {
var flag = true;
//var n = i / 2;
var n = Math.sqrt(i)
//优化:给i开根号,会比i/2再减少一半时间
for (var j = 2; j <= n; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag == true) {
arr[arr.length] = i;
}
}
return arr
}
- 代码讲解:
- 声明变量flag,目的是为了标记,将质数和非质数分开。
- 外层for循环是为了获得数字,内层for循环用来判断该数是否为质数
本人小白,有什么不对的地方或者还能继续优化的地方请大佬指出,谢谢大家!