我正在尝试创建一个函数来测试给定的整数是否为素数,我尝试使用以下方法:
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/