开发者

Ruby - determine if a number is a prime

开发者 https://www.devze.com 2023-01-14 02:30 出处:网络
I\'m running through the problems on Project Euler to teach myself Ruby programming.I know there is a built-in function to do this, but I\'m avoiding the built-in functions to help me learn.

I'm running through the problems on Project Euler to teach myself Ruby programming. I know there is a built-in function to do this, but I'm avoiding the built-in functions to help me learn.

So I have to write a method to determine if a number is a prime. The first method works, but the second doesn't. Can anyone explain why?

 def is_prime n
  for d in 2..(n - 1)
   if (n % d) == 0
    return false
   end
  end

  true
 end

 def is_prime2 n
  foundDivider = f开发者_开发知识库alse
   for d in 2..(n - 1)
    foundDivider = ((n % d) == 0) or foundDivider
   end
  not foundDivider
 end


It's because = is of higher precedence than or. See Ruby's operator precedence table below (highest to lowest precedence):

[ ] [ ]=
**
! ~ + -
* / %
+ -
>> <<
&
^ |
<= < > >=
<=> == === != =~ !~
&&
||
.. ...
? :
= %= { /= -= += |= &= >>= <<= *= &&= ||= **=
defined?
not
or and
if unless while until
begin/end

The problematic line is being parsed as...

(foundDivider = ((n % d) == 0)) or foundDivider

...which is certainly not what you mean. There are two possible solutions:

Force the precedence to be what you really mean...

foundDivider = (((n % d) == 0) or foundDivider)

...or use the || operator instead, which has higher precedence than =:

foundDivider = ((n % d) == 0) || foundDivider


Ruby comes with predefined classes such as Prime. All you have to do is to require that class into your project.

require 'prime'

Than, you can use some of the Prime methods such as first to get first x prime elements:

Prime.first(5) # Ret => [2, 3, 5, 6, 11]

Or you could do something like this:

Prime.each(100) do |prime|
  p prime # Ret => [2, 3, 5, 7, 11, ..., 97]
end

I hope you find this useful.


def prime(n)
  return false if n < 2

  (2..n/2).none?{|i| n % i == 0}
end

A prime number is any number that has no positive divisors other than itself and 1.


def prime? n
  (2..Math.sqrt(n)).none? {|f| n % f == 0}
end

The range of factors should start at 2 and end at the square root of n because every number is divisible by one and no number is divisible by two numbers greater than its square root.

Explanation: A non-prime number is the product of two numbers.

n = f1 * f2

n is always divisible by its square root so both f1 and f2 cannot be greater than the square root of n, otherwise f1 * f2 would be greater than n. Therefore, at least one factor is less than or at most equal to Math.sqrt(n). In the case of finding prime numbers its only necessary to find one factor so we should loop from 2 to the square root of n.


Find prime numbers from loop:

def get_prime_no_upto(number)
  pre = [1]
  start = 2
  primes = (start..number).to_a
  (start..number).each do |no|
    (start..no).each do |num|
      if ( no % num  == 0) && num != no
        primes.delete(no)
        break
      end
    end
  end
  pre + primes
end

and use it as below:

puts get_prime_no_upto(100)

Cheers!


Here is code that will prompt you to enter a number for prime check:

puts "welcome to prime number check"
puts "enter number for check: "
  n = gets
  n = n.to_i

def prime(n)
  puts "That's not an integer." unless n.is_a? Integer
  is_prime = true
  for i in 2..n-1
    if n % i == 0
      is_prime = false
    end
  end
  if is_prime
    puts "#{n} is prime!"
  else
    puts "#{n} is not prime."
  end
end

prime(n)


Based on the answer by Darmouse but including edge cases

def prime? (n)
    if n <= 1
        false
    elsif n == 2
        true
    else 
        (2..n/2).none? { |i| n % i == 0}
    end
end


FYI - re: DarkMouses prime method above - I found it really helpful, but there are a few errors (I think!) that need explaining:

It should be parentheses rather than square brackets... Otherwise you get a TypeError

Range can't be coerced into Fixnum (TypeError)

Secondly, that first colon before 'false' would cause an error too. It's incorrect syntax, as far as I know. Get rid of it.

Lastly, I think you got it the wrong way round?? If you correct the errors I mentioned, it returns true if it ISN'T a prime, and false if it IS.

You can drop the ternary operator altogether I think, and just do:

def prime?(n)
  (2..n/2).none?{|i| n % i == 0} 
end

Obviously it doesn't cover the edge cases (0,1,2), but let's not split hairs.

...For those who enjoy hairsplitting, here is my full solution to this problem:

    def prime?(n)
      return false if n < 2
      (2..Math.sqrt(n)).none? {|num| length % num == 0}
    end

Hope I didn't miss anything :)


This is a little bit off topic according to the details, but correct for the title : using bash integration in ruby you could do :

def is_prime n
    `factor #{n}`.split.count < 3
end

bash factor function returns a number plus all of his factors, so if the number is prime, there will be two words count.

This is usefull for code golf only.


I tried this and it worked:

def prime?(n)
  return false if n < 2 
  return true if n == 3 || n == 2 
    if (2...n-1).any?{|i| n % i == 0}
      false
    else
      true
    end
end


def prime?(n)
  if n <= 1
  return false

  else (2..n-1).to_a.all? do |integer|
   n % integer != 0

   end
  end
end

From my prime? lab. Started with eliminating all integers less than or equal to 1.


def prime(n)
    pn = [2]
    if n < 2
       return false

   else

     (2..n).each do |i|
       not_prime = false

        (2..Math.sqrt(i).ceil).each do |j|
           not_prime = true if i % j == 0    
        end
       pn.push(i) unless not_prime
    end

 end

return pn

end

p prime(30) gives

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]


It will return true if the number is prime.

def prime_number(number)
  
    (2..(number-1)).each do |value|   
        
        if (number % value) == 0
            return false
        end
        
        return true
    end    
end

puts prime_number(4)


class Object
    private
def prime? num
    if (2..3).include? num
        return true
    else
        !num.even? and num % 3 != 0 and num > 1
    end
 end
end

prime? 1 prime? 2 prime? 9 prime? 17


** FOR A SIMPLE SHORTED METHOD** FIRST INSTALL PRIME GEM

require 'prime'
`p prime.first(20)`

Now save that file as your desired name, this will generate the first 20 prime numbers Automatically!! :-)

0

精彩评论

暂无评论...
验证码 换一张
取 消