-1

我在简单的任务中遇到了问题,但是几个小时都无法弄清楚,也找不到任何示例。

我想做的事情 - Ruby 生成素数列表,用户输入一个数字(例如 - 5),Ruby 显示第 5 个素数是 11。

我有一个生成素数的代码-

def isPrime(n)
    for i in 2...n
       return false if (n%i) == 0
    end
end

(2..1000).each { |x| puts x if isPrime(x) }
4

3 回答 3

1

首先,您应该将素数保存到数组中:

@primes = []
(2..1000).each do |x|
  @primes << x if isPrime(x)
end

或者使用短一点Enumerable#select

@primes = (2..1000).select { |x| isPrime(x) }

现在您可以处理用户输入:

loop do
  print "enter a number: "
  n = gets.to_i
  puts @primes.fetch(n-1) { "unknown prime" }
end

Kernel#gets从 STDIN 读取一行,String#to_i将输入转换为整数(忽略末尾的换行符)并从数组Array#fetch中获取索引n-1处的素数或返回未知素数的消息(数组外)。

顺便说一句,您应该使用snake_case方法名称:

def is_prime(n)
  # ...
end

最好?用于谓词方法:

def prime?(n)
  # ...
end
于 2013-10-09T15:50:36.213 回答
0

用于gets从命令行获取输入。

此外,Ruby 有一个Prime您可能会觉得有用的库:

require 'prime'

puts "Which prime?"
x = gets.chomp.to_i

puts "Prime ##{x} is: #{Prime.first(x).last}"

跑步:

$红宝石素数.rb
哪个素数?
5
素数 #5 是:11
于 2013-10-09T15:15:19.283 回答
0

除了gets,您可能还想添加某种计数器来达到您的解决方案。

例如,如果用户想要第五个素数,您可以让计数器从 0 开始。每次运行该方法后,计数器都会向上移动 +1,直到达到 5。

counter=0
counter+=1
until counter =userinput
于 2013-10-09T15:45:55.533 回答