首先要知道什么是质数,质数就是除了1和本身,不能被其他任何大于0的自然数整除的数。这里还有一点1和0 既不是质数也不是合数
1.初始版本。
实现思路:定义一个随机数,把它从1开始到他自身的所有数都除一遍,判断余数是否为0,在其中加入一个字数器变量,因为质数只能被1和本身整除,所有当这个计数器的值等于2的时候,这个数就肯定是质数。
实现代码:
var conPr = 0; // 定义一个计数器变量
function numPrime() {
var num = prompt('请输入一个数');
var count = 0;
for (var i = 1; i <= parseInt(num); i++) {
conPr++; //计数器
if (parseInt(num) % i == 0) {
count++;
}
}
if (count === 2) {
return num + '是质数';
} else {
return num + '是和数';
}
}
console.log(numPrime());
console.log(conPr)
这种方法虽然直观易懂,但当数字大了之后会多很多无谓的步骤,观察计数器conPr可以发现,当输入的值是多少,循环就会执行多少次。这样是很不利于程序的运行的,当输入的值比较大,还可能会存在卡机的风险。
2.优化版本。
实现思路:依然通过用随机数去除以除1跟自身外的其他数取余来判断,只是这里用了双重for循环,当循环到某一个可以被随机数整除的数的,这个时候直接返回结果,跳出循环。这样就会少执行很多次循环。有利于程序的运行。
实现代码:
var count = 0; // 计数器
function numPrime1() {
var num = prompt('请输入一个数');
for (i = 2; i <= parseInt(num); i++) {
for (j = 2; j < parseInt(num); j++) {
count++;
if (num % j == 0) {
return num + '是和数'
}
}
return num + '是质数'
}
return '0和1既不是质数也不是和数'
}
alert(numPrime1());
console.log(count);
通过观察这里的计数器发现,这种方法是比上一种效率要高的多的。所以推荐这种写法。
(这里的计数器只是为了比较两种方法的最终循环次数,寻求最优解,跟方法本身没有什么关系的哈,是可有可无的。)
当然还有很多其他可以实现的方法,如果你有更好的方法,可以给我留言交流一下。
希望可以帮到你,觉得有用的话记得点个赞喔~