6-algorithm判断质数(素数)

475 阅读2分钟
// 判断质数(素数)

// 判断一个输入数字是否为质数

// 质数(又称为素数),是指在大于1的自然数中,除了1和它本身外,
// 不能被其他自然数整除(除0以外)的数称之为素数(质数)

// isPrime(5); // 结果 true
// isPrime(9); // 结果 false
// 算法突破口:
// 尝试将输入的数字除以所有较小的数字,
// 如果该数字只能被自身和1整除,则返回true。

function isPrime(number) {
    for (let i = 2; i < number; i++) {
        console.log('123'); // n
        if (number % i === 0) {
            return false;
        }
    }
    return true; // 1
}

// 最好情况:number = 1 或者 number = 2 => T = 1 + 1 = 2 => O(1) 常数时间复杂度
// 平均情况:O(n) 线性时间复杂度
// 最差情况:number = 100000 => T = n => O(n) 线性时间复杂度

// console.log('isPrime(1)', isPrime(1));
// console.log('isPrime(2)', isPrime(2));
// console.log('isPrime(5)', isPrime(5));
// console.log('isPrime(9)', isPrime(9));
console.log('isPrime(27277)', isPrime(27277));
// isPrime(5) true
// isPrime(9) false

// 对于一些问题来说(例如数组排序),不同的情况的时间复杂度也不同。
// 例如:将数组中的数字从小到大排序
// 性能提升:

// 例如:
// 5是质数,只能分解为1和它自身
// 9不是质数(合数):除了1和它自身以外,还可以分解为3。

// 合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整数的数。
// 因此它的乘积都可以包含两个质因素a和b,他们既不是1也不是自然数本身。

// 9 = 3 * 3, 10 = 2 * 5

// 对于所有合数来说都满足这样一个定论:至少一个因数小于或等于数字的平方根

function isPrime2(number) {
   for (let i = 2; i < Math.sqrt(number); i++) {
       console.log('123'); // n
       if (number % i === 0) {
           return false;
       }
   }
   return true; // 1
}

// 最好情况:number = 1 或者 number = 2 => T = 1 + 1 = 2 => O(1) 常数时间复杂度
// 平均情况:O(n) 线性时间复杂度 => 性能提升:O(sqrt(n))
// 最差情况:number = 100000 => T = n => O(n) 线性时间复杂度  性能提升:O(sqrt(n))
console.log('isPrime2(27277)', isPrime2(27277));
// isPrime2(27277) true