[英]Computation R program
我想計算可能被1-20的所有自然數均分的最小可能數; 我在R中編寫了以下程序,並沒有得到所需的輸出(相反,我的循環似乎永遠不會結束)。
我的計划如下:
a = 21
c = 0
while ( c < 20){
c = 0
n = 1
while ( n < 21 ){
if (a%%n == 0) c = c + 1
n = n+1
}
a = a + 1
}
print (a)
我哪里做錯了?
這是一個更類似於R的解決方案,使用這個事實,答案將是素數的乘積, p <= 20
,每個都被提升到索引i
,使得p^i <=20
sMult <- function(x)
# calculates smallest number that 1:x divides
{
v <- 1:x
require(gmp) # for isprime
primes <- v[as.logical(isprime(v))]
index <- floor(log(x)/log(primes))
prod(rep(primes,index))
}
產量:
> sMult(20)
[1] 232792560
> sMult(20)%%1:20
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
雖然這種解決方案是通用的,但應該注意的是,對於大x
, isprime
是概率性的。 當然,如果這可能會產生錯誤的結果,那么您也可能會有一個如此之大的數字,以至於無法准確存儲。 幸運的是,gmp包實現了一個大整數類bigz
。 要將此更改用於函數的最后一行,請執行以下操作:
prod(as.bigz(rep(primes,index)))
比較以下結果:
> sMult(1000)
[1] Inf
> sMult2(1000)
[1] "7128865274665093053166384155714272920668358861885893040452001991154324087581111499476444151913871586911717817019575256512980264067621009251465871004305131072686268143200196609974862745937188343705015434452523739745298963145674982128236956232823794011068809262317708861979540791247754558049326475737829923352751796735248042463638051137034331214781746850878453485678021888075373249921995672056932029099390891687487672697950931603520000"
目前還不清楚你在用n
和c
做什么
這是一個重構的例程(我不知道R語法,所以你需要轉換它,但邏輯仍然是相關的)
對於一個數均可被所有1..20均分,它可以被所有素數<= 20(顯然)均勻地除除,所以它必須可以被素數<= 20(即9699690)的乘積除。 )
所以只測試9699690的倍數是必要的。
在20開始測試,因此循環中斷更快,凈迭代更少
如果答案是>數據類型的最大值,則應在ans上添加溢出檢查
ans = 9699690
Do
Found = True
For i = 20 To 2 Step -1
If ans Mod i <> 0 Then
Found = False
ans = ans + 9699690
Exit For
End If
Next
If i < best Then best = i
If Found Then Exit Do
Loop
Debug.Print ans
使用Chris的邏輯只測試9699690的大量我可以找到答案:
found <- FALSE
test <- 9699690
while(!found)
{
test <- test + 9699690
found <- all(test%%(1:20)==0)
}
cat("The number is: ",test,"\n")
The number is: 232792560
至於為什么OP代碼不起作用,這可能是你感興趣的而不是解決這個小謎題,代碼只有一個小問題,它可能不是你的事情。 如果我們在真正答案之前輸入一個值:
a = 232792559
c = 0
while ( c < 20){
c = 0
n = 1
while ( n < 21 ){
if (a%%n == 0) c = c + 1
n = n+1
}
a = a + 1
}
print (a)
[1] 232792561
我們得到一個太多,這是因為你加1
到a
即使答案是正確的。 將它移動到外環的前面並且它可以工作。 它看起來像是一個無限循環,因為在計算這樣的事情時,它在R中太慢了。 在R中,我們需要做的事情與C之類的語言不同,因為R代碼沒有編譯(意味着循環需要很長時間)並且針對矢量化輸入進行了優化。
查看你的代碼告訴我你是R的新手,但也許有其他語言經驗,但是這種經驗對你來說不會有太多幫助。我會建議你閱讀如何對事物進行矢量化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.