2016-04-04 17 views
1

私はRでいくつかのプログラミング演習をしようとしており、数値が素数であるかどうかをチェックしたい場合は、因子を出力したいと考えています。 IF文以外のこの種類の作業は、最初のゼロ以外の剰余で停止します。任意の提案をいただければ幸いです。おかげさまで 素数関数、素数を印刷

num<-12 
x<-2 
while(x < num){ 
    if(num%%x == 0){ 
    print(paste(x, "is a factor of", num)) 
    x <- x+1 
    print(paste(num, "is not a prime number")) 
} else { 
    x <- num 
    print(paste(num, "is a prime number")) 
    } 
} 
+0

私は再現することはできませんあなたのエラー。あなたは期待どおりに動作しない場合、例を貼り付けてください。 –

+0

@VincentBonhomme投稿はどのような投稿12は素数です終了 –

答えて

3
  1. あなたはあなたがちょうどその除数によって確認された数を分割して、増加する前同じ除数でチェックを継続する必要がある素因数を印刷したい場合。これが2を2にする必要があるときに4を重要な要素として与える理由です。
  2. 数字がxで割り切れない場合は、次の数字を確認するためにxを増やす必要があります。これがすぐに15が素数であることがわかります。また

    num <- 12 
    current <- num 
    x <- 2 
    
    while (x <= num - 1){ 
        while (current %% x == 0) { 
        current <- current/x 
        print(paste(x, "is a prime factor of", num)) 
        } 
        x <- x + 1 
    } 
    if (num == current) print(paste(num, "is a prime number")) 
    

改善の余地がたくさんで非常に迅速かつ汚い実装
Rは本当にこのような何かが行われるべき言語ではありません。
ベクトル化できないので、Rはこれらのことを行うには非常に貧弱です。 確率論的テスト(Rでも遅くなる可能性があります)を使用しない限り、素数をチェックすることは計算上非常に集中的です。 R.内

+0

ここでいくつかの良い点が、OPにとって最も重要な部分は、彼らは簿記のいくつかの種類が必要です。 – Roland

1
num <- 7 # number to be evaluated 
factors <- integer(num - 2) # initialize factors 

# loop from 2 to num-1 
for (i in 2:(num-1)) { 
    # check if i is a factor of num 
    if ((num%%i)==0) { 
    # add i to vector of factors 
    factors[i-1] <- i 
    } 
} 

# remove factors==0 
factors <- factors[factors!=0] 

# check if vector factors is not empty 
# length(factors) returns false only if factors is empty 
if (length(factors)) { 
    cat(paste(num, "is NOT a prime number. Factors:\n")) 
    cat(factors) 
} else { 
    cat(paste(num, "is a prime number.")) 
} 

+++ EDITに滞在しながら、あなたは低レベルのものをしたい場合は
私はCになります++(とRcpp):ローランドにより示唆されるように変更さ

+3

'要因 'を育てないでください。最後に 'factors < - 整数(num-2)'を初期化し、 'factors [i-1] <-i'を割り当て、' factors <-factors [factors!= 0] 'を行います。オブジェクトの成長は非常に遅い操作です(どのプログラミング言語でも)。 – Roland

+0

みなさまありがとうございます - 私はあなたの回答に感謝します。私は統計のバックグラウンドを持っており、分析のためにRをたくさん使ってきましたが、プログラミングには新しく、いくつかの演習で自分自身に挑戦しようとしています。ローランド - 私はあなたが「対象を成長させる」ということをどういう意味か分かりません。 - 私はそれを避けるために、将来的にそれを避けるつもりです。 – LucaS

+0

オブジェクトを成長させるということは、forループの各反復で、ベクトル "ファクタ"のサイズが1倍(最初のバージョンのポスト)増加することを意味します。これは非常に効率的ではありません。なぜなら、各反復でベクトルをメモリ内の新しい場所にコピーする必要があるからです。メモリ空間が最初にあらかじめ割り当てられている場合、ベクトルはメモリの同じ場所にとどまるので、アルゴリズムは高速です。 – basil