我正在code wars处理一些编码挑战并遇到this one,要求我制作一个带数字的方法并确定它是否为素数。如果是素数,则该方法应返回“true”,如果该数字不是素数,则应返回“false”。
该方法通过了每个介绍性测试以及我能想到的每个数字,但是不断地将两个测试踢回去。在这一点上,我很好奇我是否对测试过程一无所知?
这是我的代码:
def isPrime(num)
counter=2 #is incremented with every time until loop loops
until counter>999999999999999 do
if num.abs <2
return false
elsif num.abs % counter == 0 && num.abs!=counter
return false
else
return true
end#if
counter+=1
end#
end```
这是代码大战发回给我的反馈
isPrime
Should have isPrime defined.
Test Passed
Should return false for numbers less than 2.
Test Passed: Value == false
Test Passed: Value == false
Test Passed: Value == false
Should return false for non-prime numbers.
Test Passed: Value == false
Test Passed: Value == false
Expected: false, instead got: true # THESE ARE THE TESTS THAT FAIL
Expected: false, instead got: true # THESE ARE THE TESTS THAT FAIL
Should return true for prime numbers.
Test Passed: Value == true
Test Passed: Value == true
Test Passed: Value == true
Test Passed: Value == true
Test Passed: Value == true
我还检查了here页面以获取有关算法的帮助。
非常感谢任何帮助。
答案 0 :(得分:2)
这里有很多问题。最大的问题是循环中的if
语句。
if num.abs <2
return false
elsif num.abs % counter == 0 && num.abs!=counter
return false
else
return true
end
没有条件,此if
语句不会终止循环并在第一次迭代中返回true
或false
。这样可以防止counter
增加。
下一个问题出在你的循环控制中。
until counter>999999999999999 do
...
counter+=1
end
在这种情况下,最好停在sqrt(num)
而不是一些大数字。为了获得更好的性能,您可能应该使用类似
until counter*counter > num do
这将避免多个sqrt计算。您可以预先计算sqrt,例如
sqrt_num = num.sqrt
until counter > sqrt_num do
(我不认识Ruby,所以我的语法可能不对,但我认为你明白了这一点)。但是,如果你这样做,请确保num
不是负面的。
如果您从循环中退出,从未找到num
的因子,您就知道该数字是素数。
答案 1 :(得分:0)
您的代码中存在2个问题
num.abs
?如果测试仪提供负数,则不会失败。通过形式定义,负数不是素数。Math.sqrt(n)
https://stackoverflow.com/a/5811176/3804420