0

PrimeNumber を返す関数を作成しようとしています。テスト目的で、この関数の段階で console.log を実行して、よりよく理解しようとしています。したがって、私の total 関数のこの行 (行:18) は単に i; を返します。console.log を実行するのとは対照的に、基本的に、30 が関数に渡され、関数はすべての素数 <=30 を返します。

wikiのこれに基づいています: このルーチンは、1 より大きく、n の平方根以下の各整数 m で n を除算することで構成されます。これらの除算のいずれかの結果が整数の場合、n は素数ではなく、そうでない場合は素数です。

(ここでの質問: 25/Math.sqrt(25) = 0、したがって NotPrime BUT 25/2=12.5, 25/3=8.3333 25/4=6.25 => IsPrime as 12.5 is not an integer または、ここで何かが間違っていますか? ??)

重複の問題もあります。13/2 と 13/3 が実行されるため、13 が 2 回出力されます。ここで質問: この重複も修正したいですか?

function isInt(n) {
   return n % 1 === 0;
}

var test = 25
console.log(Math.sqrt(test));

function prime(n) {
for(var i = 1; i <= n; i++) 
{   if(i%2 !==0 && i%3 !==0){ // if i/2 does not have a remainder it might be a prime so go to next line else jump 

to next number and i%3 the same 
        var a = Math.floor(Math.sqrt(i));
        for(j = 2; j<=a; j++){ 

            console.log(i + "/" + j); //print j//it prints 9 twice and 10 twice 
            console.log("==" + i/j);                    //because the sqrt of 9 = 3 => 

for j= 2 and j=3 
            if(isInt(i/j)) {}
            else{console.log("----"  + i + "is Prime");}
        }
    }
}
};

prime(test);

わずかに異なる方法を使用した別の例: ただし、上記の 25 と重複と同じ問題があります

var test = 25
console.log(Math.sqrt(test));

for(var i = 1; i <= test; i++) 
{   if(i%2 !==0 && i%3 !==0){ // if i/2 does not have a remainder it might be a prime so go to next line else jump to next number and i%3 the same 
        var a = Math.floor(Math.sqrt(i));
        for(j = 2; j<=a; j++){ 

            console.log(i + "%" + j); //print j//it prints 9 twice and 10 twice 
            console.log("==" + i%j);                    //because the sqrt of 9 = 3 => for j= 2 and j=3 
            if(i%j !==0) {
                console.log("----"  + i + "is Prime");

            }
        }
    }
}

[編集]私の欠陥/間違いを指摘していただきありがとうございます。ここに私の実例があります。ありがとうございました!

function isInt(n) {
   return n % 1 === 0;
}

var test = 100
console.log(Math.sqrt(test));

function prime(n) {
    for (var i = 1; i <= n; i++) {
        var a = Math.floor(Math.sqrt(i));
        var bool = true;
        for(j = 2; j<=a; j++) { 

            if(!isInt(i/j)) {
                //console.log(i+"/"+j+"=="+i/j+", therefore "+i+" is Prime");
            } else {bool = false;}
        }
        if(bool) {console.log(i+"/"+j+"=="+i/j+", therefore "+i+" is Prime");}
    }
}
prime(test);
4

1 に答える 1

0

25/Math.sqrt(25) = 0、したがって NotPrime

しかし、25/2=12.5、25/3=8.3333 25/4=6.25 => IsPrime

いいえ。2、3、4 で割り切れないからといって、25 が素数であるとは限りません。それは何によっても割り切れる必要があります(1 とそれ自体を除く) - しかし、お気づきのように 25 は 5 で割り切れます。それについても確認する必要があります。

13/2 と 13/3 が実行されるため、13 は 2 回出力されます。

ここで質問: この重複も修正したいですか?

あなたの論理には欠陥があります。上記のように、数値が他の数値で割り切れないからといって、それが素数であるとは限りませが、コードはその条件に基づいて結果を出力します。代わりに、他のすべての数で割り切れない必要があります。

2 または 3 で割り切れるものは何もループに入らないが、5、7、11 などで割り切れる (2 または 3 で割り切れない) すべてが生成されるという追加の条件があります。25 はそのシリーズの最初の数字で、次は 35 と 49 になります。

2実際には、すでにループ内で 2 と 3 をテストしてaいるので、その条件を省略してください。次のことを試した場合よりも、実際の問題にはるかに早く気付くことができたでしょう。

function prime(n) {
    for (var i = 1; i <= n; i++) {
        var a = Math.floor(Math.sqrt(i));
        for(j = 2; j<=a; j++) { 
            if(!isInt(i/j)) {
                console.log(i+"/"+j+"=="+i/j+", therefore "+i+" is Prime");
            }
        }
    }
}
prime(25);

2ロジックは次のようになります: からまでのすべての約数をテストし、 がそれらのいずれかで割り切れる場合、それが素数ではないことがわかりますsqrt(i)の約数にならずにiループを通過した場合にのみ、最終的にそれが素数であることがわかります。私はあなたに演習としてそれを残します:-)i

于 2013-07-01T23:35:17.377 に答える