为什么我只得到2和3作为假?(如果数字是素数,则返回true)

why am I getting only 2 and 3 as false? (returns true if number is prime)

本文关键字:数字 如果 true 返回 为什么      更新时间:2023-09-26

我首先会说,在数字方面我很糟糕。无论如何,我正在编写一个函数"testPrime",它接受#作为参数,如果数字是素数则返回true,如果不是素数则返回false。

代码:

function testPrime(n) {
 if (n % 2 !== 0 && n % 3 !== 0) {
    return true; 
 } else { 
    return false;
  }
};

所以我不太确定这是否正确(是吗?),但当我在控制台上通过键入testPrime(在这里插入数字)测试出大量数字时,似乎只有2和3被返回为假,而它们应该被返回为真。(2和3是素数…对吧?)我在if语句中遗漏了什么吗?似乎找不到问题。我们将不胜感激。谢谢

你好,你只将数字除以2和3,这不是找到素数的正确方法。因为有些数字只能被素数整除。例如,49不是素数,因为它只能被7整除。所以我们必须考虑所有素数小于输入数的一半。您可以查看以下代码以供参考。它会检查这个数字是否素数。

var n = 29;
var flag = true;
for(var i=2; i<n/2;i++){
  if(n%i == 0){
    flag = false;
    break;
  }
}
var docElem = document.getElementById("test");
if(flag){
  docElem.innerHTML = n + " is Prime number";
}else{
  docElem.innerHTML = n + " is not a Prime number";
}
<div id="test"><div>

在给定的代码中,您只测试了2和3的素数。因此,如果n=25,那么即使25不是素数,程序也会返回true,因为25将只检查2,3而不是5。

您应该通过添加一个循环来编写如下代码:

for (i=2 ; i<n ;)
if (n%i == 0) {
    return false;
    i++; 
    } 
    else { 
    return true;
  }

嗯。。。我手头的时间太多了。无论如何,我可能会继续收集该项可被整除的数字,尽管这会增加很多额外的计算(如果你只想要素数,你可以在第一个之后停止)。

html:

<div class="primeTest">
    <label>Enter a number</label><input type='text' id="number" class="input"/>
    <div class="results"></div>
    <div class="divisibleBy"></div>
</div>

脚本:

var test = function(n){
    var max = Math.sqrt(n),
        t = 2,
        divBy = [],
        str;
    if (!(n > 1 && n < 4)) {
        while (t <= max) {
            if (n % t === 0) divBy.push([t,n/t]);
            t++;
        }
    }
    if (divBy.length) {
        var str = '';
        divBy.forEach( function(d){
            str += '<div>' + d[0] + ' * ' + d[1] + '</div>';
        });
        $('.results').html( n + ' is NOT a prime number.');
        $('.divisibleBy').html( 'It is a product of each of the following:' + str );
    } else {
    $('.results')
        .html(n + ' IS a prime number.')
        .addClass('prime');
    }
}
$('.input').keyup(function() { test( this.value ) });

这是一把小提琴:https://jsfiddle.net/mckinleymedia/upvjuh51/3/

您还可以使用递归,试试这个功能:

var x = 2;
function testPrime(n) {
 if(n == x){
    return true;
 }
 else if((n > x) && (n%x == 0) ){
   return false;
 }
 else if((n > x) && (n%x != 0)){
   x++;
   testPrime(n);
 }
}