计算第n个素数的最短方法是什么?

发布于 2024-08-21 10:17:23 字数 807 浏览 4 评论 0原文

计算n个素数”的最短C代码是什么?

重要字符最短,即分号、非空白字符、关键字和逗号的数量

输入:

来自标准输入的整数n,用换行符分隔。输入将由 EOF 终止。

输出:

在输入 n 之后,将第 n 个素数打印到标准输出,并以换行符分隔。

(您可以假设素数<10,000,即n<1,230。)


测试用例:

Input:
    1
    2
    4
    8
    32
    999
    42
    5

Output:
    2
    3
    7
    19
    131
    7907
    181
    11

我的尝试:

 #define m 10000
 a[m],b[m],x;

 main(i,j){
   for(i=2;i<m;i++)
      {
       if (!a[i])
       for (b[++x]=i,j=2*i;j<m;j+=i)
            a[j]=1;
      }
   for(;~scanf("%d",&i);printf("%d\n",b[i]));
  }

对于这个问题,可读性不是问题。在时间和内存方面成本更高的代码但这里满足约束条件会被认为更好。

What is the shortest C code to "Calculate the n-th prime"?

Shortest in terms of significant characters, i.e. the number of semicolons, non-whitespace characters, keywords and commas.

Input:

Integers n from the standard input, separated by new lines. The input will be terminated by EOF.

Output:

Right after the input n, print the n-th prime to the standard output separated by new lines.

(You may assume the prime numbers are < 10,000, i.e. n < 1,230.)


Test cases:

Input:
    1
    2
    4
    8
    32
    999
    42
    5

Output:
    2
    3
    7
    19
    131
    7907
    181
    11

My attempt :

 #define m 10000
 a[m],b[m],x;

 main(i,j){
   for(i=2;i<m;i++)
      {
       if (!a[i])
       for (b[++x]=i,j=2*i;j<m;j+=i)
            a[j]=1;
      }
   for(;~scanf("%d",&i);printf("%d\n",b[i]));
  }

For this problem readability is not a concern.A costlier code in terms of time and memory but satisfying the constraint will be considered better here.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

烂人 2024-08-28 10:17:23

Mathematica:13 个字符

Prime@Input[]

Prime 函数已构建-在。


作为 REPL:34 个字符

While[0<(s=Input[]),Print@Prime@s]

,或者执行 10,000 次,使用 29 个字符:

Print@Prime@Input[]~Do~{1*^4}

Mathematica: 13 characters

Prime@Input[]

The Prime function is built-in.


As a REPL: 34 characters

While[0<(s=Input[]),Print@Prime@s]

or, performing exactly 10,000 times, in 29 characters:

Print@Prime@Input[]~Do~{1*^4}
想你的星星会说话 2024-08-28 10:17:23

C:104 个字符

i,t,n;g(){!--n?t=1:g();for(i=++t;1<--i;i=t%i?i:t++);}main(){for(;~scanf("%d",&n);g(),printf("%d\n",t));}

(当然,它以指数时间运行。)

(顺便说一句,仅限于 C 很无聊。现在大多数代码高尔夫都是与语言无关的 .)

C: 104 characters

i,t,n;g(){!--n?t=1:g();for(i=++t;1<--i;i=t%i?i:t++);}main(){for(;~scanf("%d",&n);g(),printf("%d\n",t));}

(And, of course, it runs in exponential time.)

(BTW, restricting to C is boring. Most code-golf here nowadays is language-agnostic.)

染火枫林 2024-08-28 10:17:23

这是Python 中的一次尝试。我不明白你在输入格式中到底是什么意思,但这应该照顾到所有情况。此外,它的速度非常慢,需要几秒钟才能生成素数,然后才能准备好处理输入。奇怪的输入解析导致它在开始生成输出之前一次吸收所有输入,因此您应该输入数字并以 EOF 结束列表,然后立即获取所有答案(或从文件重定向输入)。

import sys
p=[2]
for i in xrange(3,105000,2):
    if all(i%x for x in p):
        p.append(i)
print '\n'.join(str(p[int(i)-1]) for i in sys.stdin.read().split())

152 个字符(带空格)

130 个字符(不带空格)

Here's an attempt in Python. I didn't understand what exactly you meant in the input format, but this should take care of all cases. Also, it is horribly slow and takes a few seconds to generate the primes before it is ready to process input. The weird input parsing causes it to slurp in all input at once before starting to produce output so you should input numbers and end the list with an EOF and then get the answers all at once (or redirect input from a file).

import sys
p=[2]
for i in xrange(3,105000,2):
    if all(i%x for x in p):
        p.append(i)
print '\n'.join(str(p[int(i)-1]) for i in sys.stdin.read().split())

152 Characters (with spaces)

130 Characters (without spaces)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文