2016-04-04 16 views
1

R'de bazı programlama alıştırmaları yapmaya çalışıyorum ve bir numaranın öncelikli olup olmadığını kontrol edip etmemek istiyorsanız, faktörleri yazdırın. IF deyimi dışındaki bu tür çalışmalar sıfır olmayan ilk kalanda durur. Herhangi bir öneri takdir edilecektir. Teşekkürler. Eğer asal çarpanlarını yazdırmak istersenizAsal sayı işlevi, baskı ana öğeleri

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

ben yeniden olamaz senin hatan. Beklendiği gibi davranmadığında lütfen bir örnek yapıştırır mısınız? –

+0

@VincentBonhomme 12 Eylül başlıyor –

cevap

3
  1. Eğer sadece kendi bölen tarafından kontrol sayısına bölün ve sonra artırmadan önce aynı bölen ile denetlemeye devam etmek gerekir. Bu yüzden, 2 2 olması gerektiğinde 4'ü asal bir faktör olarak veriyor.
  2. sayı x tarafından bölünemezse, bir sonraki numarayı kontrol etmek için x değerini de artırmanız gerekir, bu yüzden derhal bir asal sayı 15 diyor.

iyileştirilmesi için oda bir sürü ile çok hızlı ve kirli uygulaması:

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")) 

ek olarak:
R gerçekten böyle bir şey yapılmalı olduğu bir dil değildir.
Vektörize edilemediği için R, bu şeyleri yapmak için çok zayıf bir seçenektir. Olasılık kontrolleri (R'de de yavaş olabilir) kullanmadıkça optimizasyonlarda bile, primalite kontrolü, hesaplama açısından son derece yoğun olabilir. R. içinde

+0

Bazı iyi noktalar burada, ama OP için en önemli bölüm bir tür muhasebeye ihtiyaç duyduğudur. – 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 kalırken, düşük seviyeli şeyler yapmak istiyorsanız
ben C içine olmazdı ++ (ve Rcpp): Roland önerdiği gibi değiştirildi

+3

Lütfen 'faktörler' büyümeyin. 'Faktörleri <- tamsayı (num - 2)' yi başlat, 'faktörlerini atama [i-1] <- i' ve 'etkenleri' - faktörleri [faktörler! = 0] 'sonunda. Bir nesneyi büyütmek çok yavaş bir işlemdir (herhangi bir programlama dilinde). – Roland

+0

Herkese teşekkürler - Yanıtlarınızı takdir ediyorum. İstatistikler arka planım var ve analiz için R'yi çok kullandım, fakat programlamada yeniyim ve sadece bazı alıştırmalarla kendime meydan okumaya çalışıyorum. Roland - 'Bir nesneyi büyüterek' ne demek istediğini tam olarak anlamadım mı? - Bundan ayrı olarak bundan kaçınmaya çalışacağım. – LucaS

+0

Bir nesneyi büyütmek, for-döngüsünün her yinelemesinde, vektörün "faktörlerinin" büyüklüğünün 1 (post'un ilk sürümünde) ile arttırıldığı anlamına gelir. Bu, vektörün her yinelemede bellekte yeni bir konuma kopyalanması gerektiğinden çok verimli değildir. Başlangıçta bellek alanı önceden ayrılmışsa, algoritma aynıdır, çünkü vektör aynı bellek konumunda kalır. – basil