我一直在学习红宝石,并且一直在做一些红宝石练习,看看我知道多少(这不是很多)。这是我遇到的一个问题:
问:编写一个方法is_prime ?,它取一个数字,如果是素数则返回true,否则返回false。
您可能希望使用模运算:5%2在将5除以2时返回余数:1。如果num可被i整除,则num%i == 0.(您不会期望已经知道关于挑战的模数)
问题还有一个答案,即。
A:
# Works for values greater than 1
def is_prime?(num)
i = 2
while i < num
is_divisible = ((num % i) == 0)
if is_divisible
# divisor found; stop and return false!
return false
end
i += 1
end
# no divisors found
true
end
这就是我提出的:
毫安:
def is_prime?(num)
if num % 2 == 0
puts "false"
else
puts "true"
end
end
由于我所拥有的与答案完全不同,我可以使用支持我的人来查看我是否在正确的轨道上。谢谢。
答案 0 :(得分:2)
开始编写自动化测试。具体地说...
assert{ 5.is_prime }
deny{ 6.is_prime }
assert{ 7.is_prime }
deny{ 8.is_prime }
deny{ 9.is_prime }
如果您的is_prime
使用return true
代替print "true"
,我的最后一个断言会破坏它。 (我在这里使用了错误的库,但您可以使用assert_true()
库附带的test/unit
个断言。)
继续添加断言,并在代码中断时修复代码,直到代码看起来像代码。然后查找“Eratosthenes筛选”的标准实现,以了解为什么代码效率低下!
答案 1 :(得分:2)
您的解决方案仅检查数字是否均匀,并且Cary Swoveland指出将错误地将2识别为非素数。您还会错误地将诸如9或15之类的数字标识为素数。
您可以做的一些事情可以加快提供的解决方案:
num
不能被2整除后,您只需要
检查那个点以后的奇数。增加你的候选人
除数为2而不是1。while
循环的上限,最大的候选除数
需要检查的是Math.sqrt(num)
。 num
的任何因子都更大
比平方根的辅助因子小于
平方根,所以没有必要看更大的
的候选者。答案 2 :(得分:1)
您的解决方案仅适用于确定数字是否可被2整除。
例如,输入值为9会导致函数返回true,即使9不是素数。它需要迭代所有可能的因素,而不仅仅是2,就像在样本解决方案中那样。
答案 3 :(得分:0)
要通过似乎是你正在尝试做的试验分区来做到这一点,最简单的方法是从i = 2开始并且做i%num == 0.然后我继续将i递增1小于数字
另外,为了使这个工作为负数,请检查num&lt; = 1.如果是,则返回false。
优化1 :(简单) 不要一直到这个数字。只能达到数字的平方根。 要轻松完成此操作,请设置循环条件(i * i&lt; = num)
优化2 :(挑战) 从3开始然后递增2,因为任何可被2整除的数字都不能成为素数。当然除了2个。
要使其工作,您需要在代码的开头添加两个以上的检查(读取:if语句)。第一个检查是否(num == 2)。如果是,返回true。第二个检查是否(num%2 == 0)。如果是,则返回false;
优化3 :(困难) 你只需要检查素数。如果生成并存储素数列表,则可以使用这些素数快速查找比列表中最高素数更大的素数。一旦你理解了优化2,你就可以很容易地写出来。
一旦你掌握了试验师,你可能想看看Eratosthenes的Sieve。这是很酷的豆子,并不难理解。