gpt4 book ai didi

ruby - 我的质数检查器测试规范失败

转载 作者:数据小太阳 更新时间:2023-10-29 09:00:20 24 4
gpt4 key购买 nike

我正在 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```

这是代码 war 发回给我的反馈

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有关算法的帮助页面。

非常感谢任何帮助。

最佳答案

这里有很多问题。最大的是循环内的 if 语句。

if num.abs <2   
return false
elsif num.abs % counter == 0 && num.abs!=counter
return false
else
return true
end

在任何情况下,此 if 语句都不会终止循环并在第一次迭代中返回 truefalse。这将防止 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 的因数,您就知道该数是素数。

关于ruby - 我的质数检查器测试规范失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37152273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com