簡體   English   中英

計算R程序

[英]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

雖然這種解決方案是通用的,但應該注意的是,對於大xisprime是概率性的。 當然,如果這可能會產生錯誤的結果,那么您也可能會有一個如此之大的數字,以至於無法准確存儲。 幸運的是,gmp包實現了一個大整數類bigz 要將此更改用於函數的最后一行,請執行以下操作:

prod(as.bigz(rep(primes,index)))

比較以下結果:

> sMult(1000)
[1] Inf
> sMult2(1000)
[1] "7128865274665093053166384155714272920668358861885893040452001991154324087581111499476444151913871586911717817019575256512980264067621009251465871004305131072686268143200196609974862745937188343705015434452523739745298963145674982128236956232823794011068809262317708861979540791247754558049326475737829923352751796735248042463638051137034331214781746850878453485678021888075373249921995672056932029099390891687487672697950931603520000"

目前還不清楚你在用nc做什么

這是一個重構的例程(我不知道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

我們得到一個太多,這是因為你加1a即使答案是正確的。 將它移動到外環的前面並且它可以工作。 它看起來像是一個無限循環,因為在計算這樣的事情時,它在R中太慢了。 在R中,我們需要做的事情與C之類的語言不同,因為R代碼沒有編譯(意味着循環需要很長時間)並且針對矢量化輸入進行了優化。

查看你的代碼告訴我你是R的新手,但也許有其他語言經驗,但是這種經驗對你來說不會有太多幫助。我會建議你閱讀如何對事物進行矢量化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM