2

我正在尝试使用 R(以及迭代器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

4 回答 4

3
help.search("least common multiple") 

library(gmp)
Reduce(lcm.bigz, 1:15)
# Big Integer ('bigz') :
# [1] 360360
于 2013-10-11T13:39:07.167 回答
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))
于 2013-10-12T07:14:08.503 回答
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
于 2013-10-11T14:42:30.827 回答
1

干得好。

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

[1] 360360

而且您可能会得到错误的答案,因为您忘记包含 8。

于 2013-10-11T13:21:44.967 回答