Ruby – 确定数字是否为素数
我正在解决Project Euler上的问题,自学Ruby编程。 我知道有一个内置函数可以做到这一点 ,但我正在避免使用内置函数来帮助我学习。
所以我必须编写一个方法来确定一个数字是否是素数。 第一种方法有效,但第二种方法没有。 有人可以解释为什么吗
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 = false for d in 2..(n - 1) foundDivider = ((n % d) == 0) or foundDivider end not foundDivider end
这是因为=
的优先级高于or
。 请参阅下面的Ruby的运算符优先级表 (从最高到最低的优先级):
[ ] [ ]= ** ! ~ + - * / % + - >> << & ^ | <= < > >= <=> == === != =~ !~ && || .. ... ? : = %= { /= -= += |= &= >>= <<= *= &&= ||= **= defined? not or and if unless while until begin/end
有问题的行被解析为......
(foundDivider = ((n % d) == 0)) or foundDivider
......这当然不是你的意思。 有两种可能的解决方案:
强制优先权是你真正的意思......
foundDivider = (((n % d) == 0) or foundDivider)
...或使用||
而不是运算符,其优先级高于=
:
foundDivider = ((n % d) == 0) || foundDivider
Ruby带有预定义的类,如Prime。 您所要做的就是要将该课程纳入您的项目。
require 'prime'
比,你可以使用一些Prime方法,比如先获得第一个x prime元素:
Prime.first(5) # Ret => [2, 3, 5, 6, 11]
或者你可以这样做:
Prime.each(100) do |prime| p prime # Ret => [2, 3, 5, 7, 11, ..., 97] end
希望这个对你有帮助。
def prime(n) (2..n/2).none?{|i| n % i == 0} end
素数是除了自身和1之外没有正除数的任何数字。
从循环中查找素数:
def get_prime_no_upto(number) 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 primes end
并使用如下:
puts get_prime_no_upto(100)
干杯!
这是代码,它将提示您输入一个用于检查的数字:
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)
def prime? n (2..Math.sqrt(n)).none? {|f| n % f == 0} end
因子范围应从2开始并以n的平方根结束,因为每个数字都可以被1整除,没有数字可以被大于其平方根的两个数字整除。
说明:非素数是两个数的乘积。
n = f1 * f2
n
总是可以被平方根整除,因此f1
和f2
都不能大于n的平方根,否则f1 * f2
将大于n
。 因此,至少一个因子小于或至多等于Math.sqrt(n)
。 在找到素数的情况下,找到一个因子是唯一必要的,所以我们应该从2
到n
平方根循环。
基于Darmouse的答案,但包括边缘案例
def prime? (n) if n <= 1 false elsif n == 2 true else (2..n/2).none? { |i| n % i == 0} end end
仅供参考 – 重新:上面的DarkMouses主要方法 – 我发现它真的很有帮助,但有一些错误(我认为!)需要解释:
它应该是括号而不是方括号……否则你会得到一个TypeError
Range can't be coerced into Fixnum (TypeError)
其次,’false’之前的第一个冒号也会导致错误。 据我所知,这是不正确的语法。 摆脱它。
最后,我认为你得到了错误的方式? 如果你纠正了我提到的错误,如果它不是素数,则返回true,如果是,则返回false。
您可以完全放弃三元运算符,只需执行以下操作:
def prime?(n) (2..n/2).none?{|i| n % i == 0} end
显然它没有覆盖边缘情况(0,1,2),但让我们不分裂头发。
…对于那些喜欢发型的人来说,这是我对这个问题的完整解决方案:
def prime?(n) return false if n < 2 (2..Math.sqrt(n)).none? {|num| length % num == 0} end
希望我没有错过任何东西:)
根据细节,这有点偏离主题,但对标题是正确的:在ruby中使用bash集成你可以做到:
def is_prime n `factor #{n}`.split.count < 3 end
bash factor
函数返回一个数字加上他的所有因子,所以如果数字为素数,则会有两个单词计数。
这仅适用于代码高尔夫 。
我试过这个并且它有效:
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
**简单的简单方法**首先安装PREME GEM
require 'prime' `p prime.first(20)`
现在将该文件保存为您想要的名称,这将自动生成前20个素数! 🙂