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

kx1ctssn  于 2023-01-02  发布在  其他
关注(0)|答案(3)|浏览(123)

我需要做一个函数,返回从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()

对于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

这显然是错的,因为某种原因,我得到了一个相同值的递增数,其中一些甚至不是质数。
谁能帮我弄明白我做错了什么?谢谢

bvpmtnay

bvpmtnay1#

不要在第二个for循环中对数字进行append运算,而是在j循环后对比较结果进行运算。原因是什么?对于2ceiling(sqrt(i))之间的每个数字,都要进行比较,而对于它们中的每一个;我相信您打算每i只执行一次,而不是每j
相反,将append移到第一个循环的末尾,并在append执行之前再进行一次比较。

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
toiithl6

toiithl62#

您可以设置切换prime <- TRUE。如果遇到复合(非质数)数,则将其切换为prime <- FALSEbreak。在内部循环结束时,如果prime切换仍然为TRUE,则将数字i附加到输出向量。

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

prime.numbers()
# [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
drkbr07n

drkbr07n3#

首先,应该在嵌套的for之后将数字追加到列表中,只追加一次,前提是要验证它对于任何数字都不可除。
代码在每次发现i %% j的除数不返回0时都会追加它,对于给定的数字,这种情况可能会发生多次,即使其他检查失败也是如此。

相关问题