我试图创建一个函数来测试给定的整数是否是质数,我尝试使用以下方法:

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都可以除以至少两个数字:1pn。质数是那些只能被这两个数相除的数。分解代码:


pn / 1:pn是除以12,...,pn的结果
pn %/% 1:pn是除以12,...,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/

10-12 17:40