我需要做一个函数,返回从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
这显然是错的,因为某种原因,我得到了一个相同值的递增数,其中一些甚至不是质数。
谁能帮我弄明白我做错了什么?谢谢
3条答案
按热度按时间bvpmtnay1#
不要在第二个
for
循环中对数字进行append
运算,而是在j
循环后对比较结果进行运算。原因是什么?对于2
和ceiling(sqrt(i))
之间的每个数字,都要进行比较,而对于它们中的每一个;我相信您打算每i
只执行一次,而不是每j
。相反,将
append
移到第一个循环的末尾,并在append
执行之前再进行一次比较。toiithl62#
您可以设置切换
prime <- TRUE
。如果遇到复合(非质数)数,则将其切换为prime <- FALSE
和break
。在内部循环结束时,如果prime
切换仍然为TRUE
,则将数字i
附加到输出向量。drkbr07n3#
首先,应该在嵌套的for之后将数字追加到列表中,只追加一次,前提是要验证它对于任何数字都不可除。
代码在每次发现i %% j的除数不返回0时都会追加它,对于给定的数字,这种情况可能会发生多次,即使其他检查失败也是如此。