9

値が素数であるかどうかをテストするプログラムを作成しようとしていますが、その方法がわかりません。これは私のコードです:

class DetermineIfPrime
def initialize (nth_value)
@nth_value = nth_value
primetest
end

def primetest
  if Prime.prime?(@nth_value)
   puts ("#{@nth_value} is prime")
  else
   puts ("This is not a prime number.")
  end
rescue Exception
puts ("#{$!.class}")
puts ("#{$!}")
 end
end

そして、私が実行するたびに、これが返されます。

NameError
uninitialized constant DetermineIfPrime::Prime

私は他の方法で仕事をしようとしましたが、これが私が得ることができる最も近い方法だと思います。

私もこれを試しました:

class DetermineIfPrime
def initialize (nth_value)
@nth_value = nth_value
primetest
end

 def primetest
 for test_value in [2, 3, 5, 7, 9, 11, 13] do
  if (@nth_value % test_value) == 0
   puts ("#{@nth_value} is not divisible by #{test_value}")
  else
   puts ("This is not a prime number since this is divisible by #{test_value}")
  break
  end
 end
 end
end

それとも私は何か間違ったことをしているだけですか?

4

10 に答える 10

27

Ruby には、数値が素数かどうかをチェックするメソッドが組み込まれています。

require 'prime'

Prime.prime?(2)  #=> true
Prime.prime?(4)  #=> false
于 2015-08-06T03:02:06.717 に答える
8

あなたが得ているエラーはPrime、コードで必要とされていないためrequire Primeです。ファイルで行う必要があります。

私がここで見つけたクールな方法の1つは、数値が素数かどうかを確認する次のとおりです。

class Fixnum
  def prime?
    ('1' * self) !~ /^1?$|^(11+?)\1+$/
  end
end

10.prime?
于 2014-05-01T07:03:00.433 に答える
3

アルゴリズムの観点から、数値が素数であるかどうかを確認するには、その数値の平方根まで (前の整数に切り捨て) までのすべての数値を確認します。

たとえば、100 が素数かどうかを調べるには、10 までのすべてを調べる必要があります。99 を調べるということは、9 だけに行くことを意味します。

** 別の考え方 **
各因子にはペアがあります (3 は 36 の因子で、3 のペアは 12 です)。
ペアは平方根の反対側にあります (6 の平方根は 36、3 < 6、12 > 6)。
したがって、平方根まですべてをチェックすることで (そしてそれを超えないようにすることで)、考えられるすべての要因を確実にチェックできます。

行っているように、比較する素数のリストを用意することで、より速くすることができます。かなり小さい最大制限がある場合は、素数のリストを取得し、直接検索してその数が素数かどうかを確認できます。

于 2012-08-01T15:45:00.877 に答える
3
def is_prime?(num)
   Math.sqrt(num).floor.downto(2).each {|i| return false if num % i == 0}
   true
end

超古い質問を復活させて申し訳ありませんが、それはグーグルで最初に出てきたものです.

基本的に、可能な除数をループし、平方根を最大数としてチェックして、非常に大きな数の時間を節約します。

于 2013-10-31T19:24:55.650 に答える
2

あなたの質問に答えて、Ruby の Prime を使用して問題にアプローチすることができますが、私はそれ自体で答えるコードを書きます。

必要なのは、整数の平方根より小さい係数を決定することだけだと考えてください。因数として整数の平方根よりも大きい数値は、数値を積としてレンダリングするために 2 番目の因数が必要です。(たとえば、15 の平方根は約 3.8 なので、因数として 5 を見つけた場合、それは因数ペア 3 と 5 を持つ因数にすぎません!!)

    def isPrime?(num)
        (2..Math.sqrt(num)).each { |i| return false if num % i == 0}
        true
    end

それが役立つことを願っています!!

于 2013-11-20T03:30:01.187 に答える
1

Prime 関数を使用する場合は、Prime ライブラリを含める必要があります。ただし、この問題はプライム ライブラリを使用しなくても解決できます。

def isPrime?(num)
  (2..Math.sqrt(num)).each { |i|
  if num % i == 0 && i < num
    return false
  end
  }
  true
  end

このようなものがうまくいくでしょう。

于 2012-10-14T12:41:25.587 に答える