素数功能,打印素因子

时间:2016-04-04 11:28:08

标签: r

我试图在R中进行一些编程练习,并希望能够检查数字是否为素数,如果不是,则打印出因子。除IF语句之外的这种工作在第一个非零余数处停止。任何建议,将不胜感激。 感谢。

num<-12
x<-2
while(x < num){
  if(num%%x == 0){
    print(paste(x, "is a factor of", num))
    x <- x+1
    print(paste(num, "is not a prime number"))
} else {
    x <- num
    print(paste(num, "is a prime number"))
    }
}

2 个答案:

答案 0 :(得分:3)

  1. 如果您想要打印素数因子,您需要将其刚刚用除数检查的数字除以后再继续使用相同的除数进行检查。这就是为什么当它应该是两个2时它将4作为主要因素。
  2. 如果该号码不能被x整除,那么您还需要增加x以检查下一个号码,这就是为什么它会立即说15是素数。
  3. 非常快速和肮脏的实施,有很大的改进空间:

    num <- 12
    current <- num
    x <- 2
    
    while (x <= num - 1){
      while (current %% x == 0) {
        current <- current / x
        print(paste(x, "is a prime factor of", num))
      }
      x <- x + 1
    }
    if (num == current) print(paste(num, "is a prime number"))
    

    另外:
    R真的不是一种应该做这样的事情的语言 由于它不能被矢量化,因此R是做这些事情的一个非常糟糕的选择。 除非你使用概率测试(在R中也可能很慢),否则即使使用优化,检查素数也可能在计算上非常密集。 如果你想在R里面做低级别的东西,我会研究C ++(和Rcpp)。

答案 1 :(得分:1)

num <- 7 # number to be evaluated
factors <- integer(num - 2) # initialize factors

# loop from 2 to num-1
for (i in 2:(num-1)) {
  # check if i is a factor of num
  if ((num%%i)==0) {
    # add i to vector of factors
    factors[i-1] <- i 
  }
}

# remove factors==0
factors <- factors[factors!=0]

# check if vector factors is not empty
# length(factors) returns false only if factors is empty
if (length(factors)) {
  cat(paste(num, "is NOT a prime number. Factors:\n"))
  cat(factors)
} else {
  cat(paste(num, "is a prime number."))
}

+++ 编辑:按照Roland的建议更改