// 判断质数(素数)
// 判断一个输入数字是否为质数
// 质数(又称为素数),是指在大于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