对 Ruby 中的一系列数字使用模数
Using modulo on a range of numbers in Ruby
我正在 ruby 中编写一个程序来查找给定数字的所有质因数。我知道 ruby 有一个 .Prime class,但我想在不使用它的情况下完成此操作。
除一个问题外,一切正常:我找不到对一系列数字进行 运行 模运算的方法。我试图在网上、Ruby 文档和此处的旧帖子中找到答案。到目前为止,我没有找到任何帮助。
代码如下:
def prime(n)
r = Range.new(2, n-1)
r.each { |x| puts x if n % x == 0 && x % (2..x-1) != 0}
end
print "Please enter a number: "
prime(gets.chomp.to_i)
编辑:抱歉,我可能含糊不清。这段代码:
x % (2..x-1) != 0
反击这个:
euler2.rb:3:in `%': Enumerator can't be coerced into Fixnum (TypeError)
from euler2.rb:3:in `block in divisible'
from euler2.rb:3:in `each'
from euler2.rb:3:in `divisible'
from euler2.rb:7:in `<main>'
我用谷歌搜索了那个错误,但没有成功。如果我将代码更改为非范围,它会起作用。
你的逻辑不正确。您尝试更简单的方法,例如:
def prime(n)
!(2..n-1).detect{|x| n%x == 0}
end
这里 detect 将 return 匹配条件 n%x == 0
的 x
的第一个值。如果 none 匹配 nil
则 returned。因此在质数的情况下 (2..n-1).detect{|x| n%x == 0}
将 return nil
而 !
将使其成为 true
。对于合数,它们的最低除数将被 returned 和 !
将使它成为 false
.
你的代码有什么问题?
你正在做 x % (2..x-1)
。这里 (2..x-1)
是一个范围。您不能用范围对 Fixnum 取模。因此你会得到:
TypeError: Range can't be coerced into Fixnum
您可以使用 (2..x-1).each{|n| x%n}
或任何其他枚举器代替 each
来改进 x % (2..x-1)
。不过我还是觉得你的逻辑太复杂了,还是这么简单的问题。
any?
怎么样?
def prime(n)
range = Range.new(2, n-1)
composite = range.any? { |i| n%i == 0 }
!composite
end
当然,对于大量数据来说这会很慢。
我正在 ruby 中编写一个程序来查找给定数字的所有质因数。我知道 ruby 有一个 .Prime class,但我想在不使用它的情况下完成此操作。
除一个问题外,一切正常:我找不到对一系列数字进行 运行 模运算的方法。我试图在网上、Ruby 文档和此处的旧帖子中找到答案。到目前为止,我没有找到任何帮助。
代码如下:
def prime(n)
r = Range.new(2, n-1)
r.each { |x| puts x if n % x == 0 && x % (2..x-1) != 0}
end
print "Please enter a number: "
prime(gets.chomp.to_i)
编辑:抱歉,我可能含糊不清。这段代码:
x % (2..x-1) != 0
反击这个:
euler2.rb:3:in `%': Enumerator can't be coerced into Fixnum (TypeError)
from euler2.rb:3:in `block in divisible'
from euler2.rb:3:in `each'
from euler2.rb:3:in `divisible'
from euler2.rb:7:in `<main>'
我用谷歌搜索了那个错误,但没有成功。如果我将代码更改为非范围,它会起作用。
你的逻辑不正确。您尝试更简单的方法,例如:
def prime(n)
!(2..n-1).detect{|x| n%x == 0}
end
这里 detect 将 return 匹配条件 n%x == 0
的 x
的第一个值。如果 none 匹配 nil
则 returned。因此在质数的情况下 (2..n-1).detect{|x| n%x == 0}
将 return nil
而 !
将使其成为 true
。对于合数,它们的最低除数将被 returned 和 !
将使它成为 false
.
你的代码有什么问题?
你正在做 x % (2..x-1)
。这里 (2..x-1)
是一个范围。您不能用范围对 Fixnum 取模。因此你会得到:
TypeError: Range can't be coerced into Fixnum
您可以使用 (2..x-1).each{|n| x%n}
或任何其他枚举器代替 each
来改进 x % (2..x-1)
。不过我还是觉得你的逻辑太复杂了,还是这么简单的问题。
any?
怎么样?
def prime(n)
range = Range.new(2, n-1)
composite = range.any? { |i| n%i == 0 }
!composite
end
当然,对于大量数据来说这会很慢。