n число, що має n кількість чітких простих факторів


10

Створіть найкоротшу функцію, програму або вираз, що обчислює A073329 , тобто a(n)- n-е число, що має n чітких простих коефіцієнтів. Введення - це кількість елементів у послідовності, яку потрібно повернути. 0 < n. Мене не турбує ціла точність. Я просто хочу алгоритм. Для мов, які не підтримують довільно великих цілих чисел, ми просто зробимо вигляд, що вони є.

Ви можете знайти тестові випадки, перейшовши за посиланням на OEIS, наведеним вище.

ОНОВЛЕННЯ:

Дозвольте мені зрозуміти, що вам потрібно повернути цілу послідовність зі своєї програми, функції чи виразу. Іншими словами, f(x)слід обчислити a(n)для всіх nвід 1 до x. З огляду xна 8, ваша функція повинна повертатися 2, 10, 60, 420, 4290, 53130, 903210, 17687670як масив чи інша відповідна структура даних.


Обмеження / межі ??
st0le

Мене насправді не хвилюють обмеження та межі, але якщо для вас це важливо, зробіть алгоритм, припускаючи, що вхід буде не більше 8, і ми будемо робити вигляд, що він працює на більші числа. Як я вже говорив, мене цікавить абстрактний математичний алгоритм, а не деталі цілочисельних обмежень певної мови.
Грегорі Хіглі

1
Можливо, це є більш відкритим, коли ми кажемо: output a(1), ... a(n)замість повернення чогось, як масив ...
користувач невідомий

Відповіді:


2

Пітон, 144 символів

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

До завершення роботи х = 8 потрібно близько 2 хвилин.


2

Java, 170 символів в одному рядку

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;
}

Оновлення, +77 символів IOL

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

Це насправді невірно, але близько, хоча я думаю, що, можливо, я можу зробити своє питання зрозумілішим. Вам слід повернути цілу послідовність. Наприклад, якщо вхід 8, ви повинні повернути перші 8 елементів у послідовності A073329.
Грегорі Хіглі

@Gregory подивіться на оновлення
cubanacan

Вибачте - я проголосував за вас, виходячи з мого власного нерозуміння завдання, яке з’ясувалося після прочитання посилання OEIS. Якщо ви внесете незначну редакцію своєї публікації, я можу і скасую свою прихильність.
користувач невідомий

@user через моє власне нерозуміння Вашого коментаря,
уточнюйте

Я неправильно зрозумів питання, і подумав, що всі фактори повинні бути чіткими простими рівнями, тому 2 * 3 * 5 * 2 було б неправильною відповіддю. Тому я проголосував вашу відповідь за те, що вважаєте помилковим. Тоді я виявив, як розуміють "чіткі праймери", і хотів виправити своє голосування, але мені не дозволяється змінювати свій голос - це можливо лише в перші кілька хвилин. Але якщо ви відредагуєте свою відповідь, я можу змінити свій голос. Тому я прошу вас трохи відредагувати.
користувач невідомий

2

Ява (без вогню)

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);
        }
    }
}

Використовує алгоритм сита. Це досить швидко. (6 секунд) Працює точно для upto 8, ймовірно, не вдасться до чогось більш високого.


1

JavaScript, 149 символів

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 не відповідає, тому я не перевіряв, скільки часу займає (мій веб-переглядач спливає повідомлення про вивішений сценарій кожні 10 секунд або близько того, тому я не можу встигнути його точно і не хочу повністю висіти, якщо я встановіть прапорець "не показувати це знову" ...)

Редагувати: для повернення масиву 200 символів (+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 байти

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

Але оскільки я відповідаю на власне запитання так пізно, ми просто залишимо цю відповідь як цікавість.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.