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)
这显然是错误的。由于某种原因,我得到的相同值的数量越来越多,其中一些甚至不是素数。
谁能帮助我理解我做错了什么?谢谢
不要使用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)