R 中带有嵌套循环的素数函数给出了错误的结果

Nin*_*ina 3 debugging primes for-loop r nested-loops

我需要创建一个函数,返回从 3 到 n 的所有素数的向量。我知道有更简单的方法可以让函数确定一个数字是否为素数,但我被特别要求使用 2 循环。我的功能:

prime.numbers = function(n= 100){
  l=c()
  for (i in 3:n){
    for (j in 2:ceiling(sqrt(i))){
      if ((i %% j )== 0) {
        break      }
      else{ l= append(l,i)}
    }  }
  return(l)}

prime.numbers()
Run Code Online (Sandbox Code Playgroud)

以 n = 100 为例,我得到:

  [1]  3  5  5  7  7  9 11 11 11 13 13 13 15 17 17 17 17 19 19 19 19 21 23 23 23 23
 [27] 25 25 25 27 29 29 29 29 29 31 31 31 31 31 33 35 35 35 37 37 37 37 37 37 39 41
 [53] 41 41 41 41 41 43 43 43 43 43 43 45 47 47 47 47 47 47 49 49 49 49 49 51 53 53
 [79] 53 53 53 53 53 55 55 55 57 59 59 59 59 59 59 59 61 61 61 61 61 61 61 63 65 65
[105] 65 67 67 67 67 67 67 67 67 69 71 71 71 71 71 71 71 71 73 73 73 73 73 73 73 73
[131] 75 77 77 77 77 77 79 79 79 79 79 79 79 79 81 83 83 83 83 83 83 83 83 83 85 85
[157] 85 87 89 89 89 89 89 89 89 89 89 91 91 91 91 91 93 95 95 95 97 97 97 97 97 97
[183] 97 97 97 99
Run Code Online (Sandbox Code Playgroud)

这显然是错误的。由于某种原因,我得到的相同值的数量越来越多,其中一些甚至不是素数。

谁能帮助我理解我做错了什么?谢谢

r2e*_*ans 6

不要使用append第二个循环中的数字for,而是将其作为循环后比较的结果j。原因?对于2和之间的每个数字ceiling(sqrt(i)),您都在进行比较,并且对于每个数字;我相信你打算只这样做一次 per i,而不是 per j

相反,将 移至append第一个循环的末尾,并在appending 之前进行另一次比较。

prime_number <- function(n = 100) {
  l = c()
  for (i in 3:n){
    for (j in 2:ceiling(sqrt(i))){
      if ((i %% j) == 0) break
    }
    if ((i %% j) != 0) { l = append(l,i); }
  }
  l
}
prime_number()
#  [1]  3  5  7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Run Code Online (Sandbox Code Playgroud)