求质数这个问题在我们学编程之初会经常遇到,如下代码:
console.time('prime');
// 遍历2-10000
for(var i = 2; i < 10000; i++) {
// 设置标志变量
var isPrime = true;
// 循环判断
for (var j=2; j < i; j++) {
if(i%j == 0){
isPrime = false;
}
}
// 是否为质数
if (isPrime) {
console.log(i);
}
}
console.timeEnd('prime');
复制代码
上述代码,是可以求出2-10000之内的质数,但是这段代码是否完美?
下面思考两个问题:
- 当出现一个数,可以被整除,那么接下来的数还需要取余吗?
- 内层循环是不是可以不必要遍历到i
基于以上两个问题修改代码为:
console.time('prime');
// 遍历2-10000
for(var i = 2; i < 10000; i++) {
// 设置标志变量
var isPrime = true;
var innerCount = Math.sqrt(i);
// 循环判断
for (var j=2; j < innerCount; j++) {
if(i%j == 0){
isPrime = false;
break;
}
}
// 是否为质数
if (isPrime) {
console.log(i);
}
}
console.timeEnd('prime');
复制代码
-------------------------------我是一条分割线---------------------------- 那么我们就看一下上边两段代码运行的时间,根据i的不同两段代码运行时间如下: