2016-05-11 6 views
2

私はcode warsでコード化の問題を抱えていて、this oneに連絡して番号を取り、それが素数であるかどうかを判断する方法を尋ねました。プライムである場合、メソッドはプライムでない場合は "true"を返し、 "false"を返す必要があります。私の素数チェッカーでテスト仕様が失敗する

このメソッドは、すべての導入テストとそれにスローすると考えられる各数値を渡しますが、誤って2つのテストを継続的に実行します。この時点で、テストプロセスについて何かを理解していないのであれば、私は不思議です。

これは私のコードです:

def isPrime(num) 
    counter=2 #is incremented with every time until loop loops 
    until counter>999999999999999 do 
    if num.abs <2 
     return false  
    elsif num.abs % counter == 0 && num.abs!=counter 
     return false 
    else 
     return true 
    end#if 
    counter+=1 
    end# 
end``` 

と、これはバックそのコード戦争フィードでは、また、私は、アルゴリズムについてのヘルプはhereページをチェックする私に戻って

isPrime 
Should have isPrime defined. 
Test Passed 
Should return false for numbers less than 2. 
    Test Passed: Value == false 
    Test Passed: Value == false 
    Test Passed: Value == false 
Should return false for non-prime numbers. 
    Test Passed: Value == false 
    Test Passed: Value == false 
    Expected: false, instead got: true # THESE ARE THE TESTS THAT FAIL 
    Expected: false, instead got: true # THESE ARE THE TESTS THAT FAIL 
Should return true for prime numbers. 
    Test Passed: Value == true 
    Test Passed: Value == true 
    Test Passed: Value == true 
    Test Passed: Value == true 
    Test Passed: Value == true 

を送信しています。

ご協力いただきまして誠にありがとうございます。

+0

残念ながら、私はアカウントなしでそのページにアクセスすることはできません。失敗した2つのテストで実際にどのような価値がテストされていますか?一般的な注意点として、 'abs'を使用すると疑わしい(あなたのプログラムは-3が素数だと言うが、負の数は素数ではない(https:// math。stackxchange.com/questions/1002459/do-we-have-negative-prime-numbers))、アルゴリズムはひどく非効率的です。なぜなら、sqrt(num)などにしかならないからです。 –

答えて

0

あなたのコード

  1. なぜあなたはnum.absを取っている中2つの問題がありますか?テスターが負の数を提供する場合、それは失敗しません。正式な定義では、負の数は素数ではありません。
  2. プログラムは多くの問題がここにありますMath.sqrt(n)https://stackoverflow.com/a/5811176/3804420
2

で停止することができます。最大のものはループ内にあるifステートメントです。

if num.abs <2 
    return false  
elsif num.abs % counter == 0 && num.abs!=counter 
    return false 
else 
    return true 
end 

このif文はループを終了し、最初の反復でtrueまたはfalseのいずれかを返さないであろうその下で何の条件もありません。これにより、counterの増分が防止されます。

次の問題はループコントロールにあります。あなたはsqrt(num)ではなく、いくつかの大規模な数で停止した方が良いでしょう。この場合

until counter>999999999999999 do 

    ... 

    counter+=1 
end 

を持っています。パフォーマンスを向上させるには、代わりにループコントロールとして使うべきでしょう。

until counter*counter > num do 

これにより、複数のsqrt計算が回避されます。あなたは(私は構文が間違っていて、私はルビーを知らないが、私は、あなたがポイントを得ると思います)

sqrt_num = num.sqrt 
until counter > sqrt_num do 

のようなものではなく、SQRTを事前に計算できます。あなたがこれを行う場合でも、手の前にnumが否定的でないことを確かめてください。

ループを終了しても、numのファクタが見つからない場合は、その数が素数であることがわかります。

+0

'sqrt(num ) '一度頭が一層効率的になりますか?また、偶数をスキップする2つのステップ(頭に適切な偶数のチェックを追加した後)を実行すると、さらに効率的になります。 –

+0

はい、仕事は進行中です。彼のロジックの本当に大きな問題は 'if'ステートメントです。 – andand

関連する問題