歐拉項目問題12的想法是找到具有指定數量除數的最小三角形數(https://projecteuler.net/problem=12)。作爲一種嘗試,以解決這個問題,我寫了下面的代碼:爲歐拉項目12優化簡單r代碼
# This function finds the number of divisors of a number and returns it.
FUN <- function(x) {
i = 1
lst = integer(0)
while(i<=x)
{
if(x %% i ==0)
{
lst = c(lst, i)
}
i = i +1
}
return(lst)
}
和
n = 1
i=1
while (length(FUN(n))<500)
{
i = i + 1
n = n + i
}
此代碼產生了一些較小的測試案例正確答案:length(FUN(n))<4
會產生6
和length(FUN(n))<6
會產生28
。
但是,這個簡單的代碼需要24小時才能運行(並且仍在運行)length(FUN(n))<500
。我知道一個數字有500個因子,這個數字可能非常大,但我想知道爲什麼它需要很長時間才能運行因此。
您正逐漸增加向量元素,由於內存分配,這在R中本質上很慢。通過向量化操作來擺脫'FUN'中的'while'循環,以避免部分問題,儘管這仍然會留下外部循環。對於前10個三角形數字來說,速度要快,但速度並不快(而且整理一下):'三角形< - data.frame(number = cumsum(1:10)); $ n_factors < - sapply(三角形$ number,function(x){sum(x %% seq.int(x)== 0)});三角形' – alistaire
閱讀[這篇文章](https://stackoverflow.com/questions/6424856/r-function-for-returning-all-factors) – Mist
@alistaire你的函數可能是'function(x){sum (x %% seq.int(sqrt(x))== 0)* 2})'。會快得多,但平方的數字會比實際應得的多一個因素。只有一個問題,如果你找到一個正好有500個因子的數字。 – Mist