我正在尝试使用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
。
答案 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))