我试图创建一个函数来测试给定的整数是否是质数,我尝试使用以下方法:
tpn <- function(prime.num){
if(prime.num==2){
print("PRIME")
} else {
if(prime.num%%(2:(prime.num-1))!=0){
print("PRIME")
} else {
print("NOT PRIME")
}}}
尽管我不明白为什么,但这是行不通的。我正在检查给定的数字是否可以除以该整数的任何整数而没有余数。如果不能,则数字为素数。
我发现的另一个解决方案是:
tpn <- function(pn){
if(sum(pn/1:pn==pn%/%1:pn)==2)
print("prime")
}
这可行。虽然,我无法理解
sum(pn/1:pn == pn%/%1:pn) == 2
实际测试的内容。 最佳答案
如果除法a
的结果等于整数除法b
的结果,则数字a / b
可被数字a %/% b
整除。任何整数pn
都可以除以至少两个数字:1
和pn
。质数是那些只能被这两个数相除的数。分解代码:pn / 1:pn
是除以1
,2
,...,pn
的结果pn %/% 1:pn
是除以1
,2
,...,pn
的整数的结果sum(pn / 1:pn == pn %/% 1:pn)
是多少个相等,即pn
的整数除数的数量。如果此数字为2
,则表示质数。
您的代码出了什么问题:if
需要测试某些东西是TRUE
还是FALSE
,但是您要传递一个完整的向量。另外,您的逻辑是错误的。应该是:
is.prime <- function(num) {
if (num == 2) {
TRUE
} else if (any(num %% 2:(num-1) == 0)) {
FALSE
} else {
TRUE
}
}
一旦确定要返回逻辑,就可以使代码更短:
is.prime <- function(n) n == 2L || all(n %% 2L:max(2,floor(sqrt(n))) != 0)
(其中包含@Carl关于不检查所有数字的评论。)
关于r - R中的质数函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19767408/