使用我的素数检查器测试规范失败

时间:2016-05-11 02:48:52

标签: ruby algorithm primes

我正在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页面以获取有关算法的帮助。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

这里有很多问题。最大的问题是循环中的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的因子,您就知道该数字是素数。

答案 1 :(得分:0)

您的代码中存在2个问题

  1. 你为什么选择num.abs?如果测试仪提供负数,则不会失败。通过形式定义,负数不是素数。
  2. 该计划可以在Math.sqrt(n) https://stackoverflow.com/a/5811176/3804420
  3. 停止