第n个具有n个不同素数的数


10

创建计算A073329的最短函数,程序或表达式,即a(n)是具有n个不同素数的第n个数。输入是要返回的序列中元素的数量。。我不关心整数精度。我只想要算法。对于不支持任意大整数的语言,我们只是假装它们支持。0 < n

您可以通过上面提供的OEIS链接找到测试用例。

更新:

让我明确指出,您需要从程序,函数或表达式返回整数序列。换句话说,f(x)应该计算从1到的a(n)所有值。给定为8,您的函数应以数组或其他适当的数据结构形式返回。nxx2, 10, 60, 420, 4290, 53130, 903210, 17687670


限制/界限?
st0le 2011年

我并不真正在乎限制和界限,但是如果对您来说很重要,请在算法假设输入不超过8的情况下进行操作,我们会假装它适用于更高的数字。如我所说,我对抽象数学算法感兴趣,而不是对特定语言的整数限制的详细信息感兴趣。
格雷戈里·希格利

1
当我们说时,它可能更开放:output a(1), ... a(n)而不是返回某些东西,例如数组……
用户不知道

Answers:


2

Python,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

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

更新,IOL +77个字符

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

这实际上是不正确的,但是很接近,尽管我认为我应该使我的问题更清楚。您应该返回一个整数序列。例如,如果输入为8,则应返回A073329序列中的前8个元素。
格雷戈里·希格利

@格雷戈里看更新
古巴

抱歉-基于对任务的自己的误解,我对您投了反对票,这一点在阅读OEIS链接后得到了澄清。如果您对帖子进行少量修改,我可以并且将撤消我的弃权票。
用户未知,

@用户,因为我自己对您的评论有误解,请澄清您的请求
古巴,

我误解了这个问题,并认为所有因素都必须是不同的素数,因此2 * 3 * 5 * 2是错误的答案。因此,我将您的回答否定为“虚假”。然后,我发现如何理解“不同的素数”,并想更正我的投票,但是我不允许更改我的投票-只有在最初的几分钟内,才可以更改我的投票。但是,如果您编辑答案,我可以更改我的投票。所以我要你编辑一下。
用户未知,

2

Java(未发布)

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秒) 可以准确地工作到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:)

但是,由于我这么晚才回答自己的问题,我们只是出于好奇而将其保留。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.