可以被前几个自然数整除的最小数字(使用R foreach包)

时间:2013-10-11 13:02:56

标签: r foreach iterator

我正在尝试使用R(iterators以及foreach)解决以下(Project Euler)问题,

  

可以被所有人整除的最小正数是多少   从1到15的数字?

虽然我认为我的代码应该完成这项工作,但似乎并非如此:

library(foreach)
library(iterators)

# function to check sequence of natural numbers for  
#   divisibility by a given list of factors
fnDivision = function(maxNum, vFactors) {
  foreach(i = icount(factorial(15))) %do% {
    if(!i %% 100 ) cat(sprintf("Done with the first %i natural numbers.\n", i))
    if(all(! i %% vFactors)) { 
      return(i)
    }
  } 
}

# test the function
vFactors = c(8, 9, 10, 11, 12, 13, 14, 15)
fnDivision(15, vFactors)

请注意,我已经减少了测试从1到15的所有自然数到自然数的自然数序列的因子的数量。

以防万一,A003418给出了正确答案,如360360,以及

all(! 360360 %% vFactors)

评估为TRUE

4 个答案:

答案 0 :(得分:3)

help.search("least common multiple") 

library(gmp)
Reduce(lcm.bigz, 1:15)
# Big Integer ('bigz') :
# [1] 360360

答案 1 :(得分:1)

你走了。

x <- 8:15
p <- prod(x)
min(Reduce(intersect, lapply(x,function(i) seq(i,p,i))))

[1] 360360

你可能得错了答案,因为你忘了包含8。

答案 2 :(得分:1)

考虑到你的减少的除数,这应该非常快(是的,即使它是for循环 - 它只有迭代等于除数的长度)并且依赖于乘以每个除数的最大幂你的除数中的主要因素......

#  For primeFactors function
require( surveillance )
x <- c( 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 )
#  Output vector
out <- numeric(0)
#  Maths magic
for( i in x ){
  tmp <- primeFactors(i)
  out <- c( out , tmp[ ! tmp %in% out ] ) 
}
prod( out )
[1] 360360

答案 3 :(得分:1)

因此经过一番思考后,我认为我尝试使用foreach包来访问迭代器流是错误的。相反,这是我高兴的(高度Pythonic)解决方案:

library(iterators)

# function to check sequence of natural numbers for  
#   divisibility by a given list of factors
fnDivision = function(maxNum, vFactors) {
    i = icount(factorial(15))
    while(TRUE) {
        currentlyTesting = nextElem(i)
            if(all(! currentlyTesting %% vFactors)) { 
            return(currentlyTesting )
            }
    } 
}

# test the function
vFactors = c(8, 9, 10, 11, 12, 13, 14, 15)
sprintf('The smallest natural number divisible by the first 15 natural numbers is %i.', 
    fnDivision(15, vFactors))