一尘不染

为什么我的用于查找质数的红宝石编码不起作用?

algorithm

我想知道为什么我的代码不起作用。我是代码领域的新手,所以如果有人可以为我解决这个问题,以及如何最好地解决它,谢谢!

我正在尝试创建一个程序,该程序将从我指定的数字列表中指示质数。

请告诉我为什么这两个代码不起作用!我对第二代码试图做的事情感到困惑,因为我发现它是别人对我的问题的解决方案。我是编码新手,但我喜欢它,所以请多多包涵!

这是我的简单代码:

def is_prime?(*nums)

    i = 2
    nums.each do |num|
        while i < num
            if num % i == 0
                puts "#{num} is not a prime"
            else
                puts "#{num} is a prime"
            end
            i += 1
        end
    end
end

....为什么这不起作用?我如何使它工作?它一直给我一个怪异的答案,因为它卡在我的第一个数字上,似乎不处理我在输入时插入的下一个数字:

puts is_prime?(21, 23, 17)

这是我也无法正确运行的第二个代码。有人可以分解这里发生的事情吗?我如何使它工作?

def is_prime?(*nums)
    nums.each_with_object({}) do |num, hsh|
        hsh[num] = num > 1 && 2.upto(num - 1).none? {|i| num % i == 0}
    end
end

puts is_prime?(27, 13, 42)

无论如何,我知道这个问题有点令人困惑,但是如果有人愿意输入2美分,我将不胜感激!哦,最后我该如何在问题板上正确张贴代码?没有导师,我是如此新奇,如此困惑!


阅读 223

收藏
2020-07-28

共1个答案

一尘不染

你有几个问题。前面已经确定了一个:语句的位置i = 2。这是固定的代码。

def is_prime?(*nums)
    nums.each do |num|
    i = 2
      while i < num
        if num % i == 0
          puts "#{num} is not a prime"
        else
          puts "#{num} is a prime"
        end
        i += 1
      end
   end
end

num % i == 0你已经确定的数量不是素数,并打印一个消息到效果,但你继续检查,看它是否是整除小于所有较大的数字num。每次num % i == 0打印出来都不是素数。关键是,一旦确定数字不是素数,就无需继续检查。

另一个问题是,每当num % i != 0您打印该数字为质数时。但是,这还为时过早。在确定num % i != 0所有小于的整数之前,您不能得出该结论num

让我们看看如何解决这些问题。我认为最简单的方法是编写一个单独的方法来确定单个数字是否为质数。我已经调用了该方法is_prime?并重命名了main方法is_each_prime?

def is_each_prime?(*nums)
  nums.each { |num|
    puts "#{num} is #{ is_prime?(num) ? '' : "not " }a prime" }
end

def is_prime?(num)
  (2...Math.sqrt(num)).all? { |i| num % i != 0 }
end

puts is_each_prime?(21, 23, 17)
  #=> 21 is not a prime
  #   23 is a prime
  #   17 is a prime

创建单独方法的一个优点is_prime?是可以单独测试它,以确保它正常工作。

2020-07-28