n farklı asal faktöre sahip n. sayı


10

Hesaplar olan en kısa fonksiyonu, program ya da deyim oluşturma A073329 , yani, a(n)bir n'inci sahip numara n ayrı ana faktörler. Girdi, dizideki döndürülecek öğelerin sayısıdır. 0 < n. Tamsayı hassasiyetiyle ilgilenmiyorum. Sadece algoritmayı istiyorum. Keyfi büyük tamsayıları desteklemeyen diller için, sadece öyle yapıyormuş gibi davranacağız.

Test örneklerini yukarıda verilen OEIS bağlantısını takip ederek bulabilirsiniz.

GÜNCELLEME:

Programınızdan, işlevinizden veya ifadenizden bir tamsayı dizisi döndürmeniz gerektiğini netleştireyim . Başka bir deyişle, f(x)hesaplamak gerekir a(n)herkes için n1'den için x. x8 verildiğinde , işleviniz 2, 10, 60, 420, 4290, 53130, 903210, 17687670bir dizi veya başka bir uygun veri yapısı olarak dönmelidir .


Sınırlar / sınırları ??
st0le

Sınırlar ve sınırlarla gerçekten ilgilenmiyorum, ancak sizin için önemliyse, girdinin 8'den fazla olmayacağını varsayarak algoritmayı yapın ve daha yüksek sayılar için çalışıyormuş gibi davranacağız. Dediğim gibi, soyut bir matematik algoritmasıyla ilgileniyorum, belirli bir dilin tamsayı sınırlamalarının ayrıntılarıyla değil.
Gregory Higley

1
Belki daha açık, biz dediğimizde: bir output a(1), ... a(n)şey gibi, bir dizi gibi dönmek ...
kullanıcı bilinmiyor

Yanıtlar:


2

Python, 144 karakter

R=range
P=[x for x in R(2,99)if all(x%i for i in R(2,x))]
for a in R(input()):
 x=n=0
 while n<=a:n+=sum(x%p==0for p in P)==a+1;x+=1
 print x-1

X = 8 için tamamlanması yaklaşık 2 dakika sürer.


2

Java, bir satırda 170 karakter

int a(int n) {
    int a = 2, t = a, m = 1, i = 1;
    Set s = new HashSet();
    while (i++ > 0) {
        if (t % i == 0) {
            s.add(i);
            t /= i;
            if (t == 1) {
                if (s.size() == n) {
                    if (n == m) {
                        break;
                    }
                    m++;
                }
                t = ++a;
                s.clear();
            }
            i = 1;
        }
    }
    return a;
}

Güncelleme, +77 karakter IOL

int[] f(int n) {
    int[] f = new int[n];
    for (int i = 0; i < n; i++) {
        f[i] = a(i+1);
    }
    return f;
}

Bu aslında yanlış, ama yakın olsa da, belki de sorumu daha net hale getirmem gerektiğini düşünüyorum. Bir tamsayı dizisi döndürüyor olmalısınız. Örneğin, giriş 8 ise, A073329 dizisindeki ilk 8 öğeyi döndürmelisiniz.
Gregory Higley

@Gregory güncellemeye bakın
cubanacan

Özür dilerim - OEIS bağlantısını okuduktan sonra açıklığa kavuştuğum görevi yanlış anladığım için sana oy verdim. Yayınınızda küçük bir düzenleme yaparsanız, downvote'umu iptal edebilirim ve iptal edeceğim.
kullanıcı bilinmiyor

@kendi yorumunuzu yanlış anladığım için, isteğinizi netleştirin, lütfen
cubanacan

Soruyu yanlış anladım ve tüm faktörlerin farklı temeller olması gerektiğini düşündüm, bu yüzden 2 * 3 * 5 * 2 yanlış bir cevap olacaktır. Ben de yalancı yanlış cevabını verdim. Sonra, 'farklı asalların' nasıl anlaşılacağını keşfettim ve oyumu düzeltmek istedim, ancak oyumu değiştirmeme izin verilmiyor - sadece ilk birkaç dakika içinde mümkün. Ancak cevabınızı düzenlerseniz oyumu değiştirebilirim. Bu yüzden sizden biraz düzenlemenizi istiyorum.
kullanıcı bilinmiyor

2

Java (Ungolfed)

public class M {

    public static void main(String[] a) {
        final int N = 100000000;
        int[] p = new int[N];
        for(int f = 2; f * f < N; f++) {
            if(p[f] == 0)
                for(int k = f; k < N; k += f)
                    p[k]++;
        }
        for(int i = 1; i <= 8; i++) {
            int c = 0, j;
            for(j = 1; j < N && c < i; j++)
                if(p[j] == i)
                    c++;
            if(c == i)
                System.out.println(i + " = " + --j);
        }
    }
}

Elek algoritması kullanır. Oldukça hızlı. (6 Saniye) Kadar doğru çalışacak 8, muhtemelen daha yüksek bir şey için başarısız olacaktır.


1

JavaScript, 149 karakter

function(n){function f(x){for(r=[],o=x,z=2;z<=o;x%z?++z:(x/=z,r.indexOf(z)+1?0:r.push(z)));return r}for(c=0,i=1;c<n;)f(++i).length==n?c++:0;return i}

N> = 6 için tepkisiz hissediyor, bu yüzden ne kadar sürdüğünü test etmedim (tarayıcım 10 saniyede bir asılı komut dosyası bildirimi ya da bu nedenle doğru bir şekilde zamanlayamıyorum ve eğer tamamen asmak istemiyorum "bunu bir daha gösterme" ...)

Düzenleme: Dizi dönmek için 200 karakterdir (+51) :

function(n){function F(){function f(x){for(r=[],o=x,z=2;z<=o;x%z?++z:(x/=z,r.indexOf(z)+1?0:r.push(z)));return r}for(c=0,i=1;c<n;)F(++i).length==n?c++:0;return i}for(a=[];n>0;n--)a.push(f());return a}

0

J, 32 bayt

({"0 1~i.@#)(]/.~#@~.@q:)

Ama kendi sorumu çok geç cevapladığım için, bu cevabı merak olarak bırakacağız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.