5

固有約数の合計がその数に等しいという特性を示す数を見つけることに興味があります。最初の例は 6 で、適切な除数は 1 + 2 + 3 = 6 です。

次のコードを R で書きましたが、かなり非効率的であり、大幅に改善できると思います。

propDivisor <- function(
    max
)
{
    n<-{}
    for(j in 2:max){
        m<-{}
        for(i in 1:(j/2+1)){
            if(j%%i==0){m<-c(m,i)}
        }   
        if(sum(m)==j){n<-c(n,j)}
    }
return(cat("The proper divisors between 1 and", max, "are", n, ".", sep=" ")    )
}

次のコードを改善するための提案はありますか? ここで適用機能の1つを使用する必要があると思います。多分これは将来のためのまともなコードゴルフ練習になるでしょうか?

これは宿題の問題ではなく、今日同僚が興味深いコーディングの挑戦者として提起したものです。

アップデート:

詳細な情報を探す場所について、コメントや考えをお寄せくださった皆様に感謝します。sapply を利用する別のソリューションを次に示します。

D <- function(n) sum((1:(n-1))[n%%1:(n-1)==0])==n
(2:9000)[sapply(2:9000,D)]
4

3 に答える 3

6

あなたが探しているものは完全数と呼ばれます(適切な約数の合計は数自体に等しい)。

アプローチ自体の改善を検討している場合は、こちらを参照してください

適切な約数を見つけるには、次のように改善する必要があります。

  • ループは sqrt(max) で停止できます
  • そして、除数 i を見つけるたびに、max/i == i でない限り、max/i も除数であり、カウントされるべきではありません。
于 2010-06-29T01:05:58.780 に答える
2

2^n - 1 が素数である場合、2^(n-1)*(2^n -1) の形式の数は完全数です。

于 2011-11-06T18:32:37.090 に答える