所有素数从0到1000


9

是否可以使C代码更小?它打印出从0到1000的所有素数。

C,89个字符

int i,p,c;for(i=2;i<1e3;i++){c=0;for(p=2;p<i;p++)if(i%p==0)c++;if(c==0)printf("%u\n",i);}

6
只是为了抢先一些“我们不想针对语言的挑战”,请寻求帮助,将一些代码打成主题,这与挑战是不同的。
Martin Ender'1

4
我们需要保留算法还是仅保留最终结果?
John Dvorak 2015年

我会从2开始我是严格准确的,因为这会打印0和
1。– histocrat

您是要使代码执行得更快还是要在源代码中使用更少的字符?
user3629249 2015年

1
由于您正在寻求高尔夫方面的帮助,因此在帖子中包含当前解决方案的字符数将很有帮助(我将其设为89)。
马克·里德

Answers:


7

59 57字节

基于@feersum解决方案,但可以进一步进行素性检查

for(int p=1,d;d=p++%999;d||printf("%d\n",p))for(;p%d--;);

根据Runer112的评论进行编辑


2
装订的支票可以打更多一点:d=p++%999。否则,这看起来很不透气。
Runer112

10

67字节

在C语言中,没有什么可以真正替代试行法,但是可以肯定地打了一下。

for(int p=1,d;p++<999;d&&printf("%d\n",p))for(d=p;--d>1;)d=p%d?d:1;

需要C99初始声明,该声明节省1个字节。


6

(我写这篇文章并没有意识到C语言中整数的大小限制,因此对于缩短代码实际上没有用。)

首先,谈一谈算法。在编写代码之前,您应该考虑最好的整体策略来获得结果。

你做审判庭检查素性-测试每个潜在除数pi。以字符为单位的代价很高,因为它需要两个循环。因此,无循环地测试素数可能节省字符。

通常更短的方法是使用威尔逊定理n当且仅当该数为质数

fact(n-1)%n == n-1

fact阶乘函数在哪里。由于您正在测试n1到的所有可能的情况1000,因此可以通过跟踪正在运行的产品PP*=n在每个循环之后进行更新来避免实施阶乘。这是此策略Python实现,可打印最多一百万个素数。

另外,您的程序只需要达到1000个就可以打开另一个策略:Fermat素数测试。对于某些人来说a,每个总理都n可以满足

pow(a,n-1)%n == 1

不幸的是,有些复合材料n也通过了这一测试a。这些称为Fermat伪素数。但是,a=2并且a=3不要在一起直到都失败n=1105,所以它们足以满足您检查质数直到1000的目的。(如果1000代替100,则只能使用a=2。)因此,我们使用(非在线代码)检查素数

pow(2,n-1)%n == 1 and pow(3,n-1)%n == 1

这也无法识别素数2和3,因此需要特例。

这些方法是否更短?我不知道,因为我不使用C语言编写代码。但是,它们是您在尝试编写一段代码开始计算字符之前应该尝试的想法。


1
威尔逊定理在C中没有用,因为ints是32位的。费马公司也是如此。
feersum

@feersum哦,拍。对于析因来说,这也是一个问题。是否有big-int类型?
xnor 2015年

@xnor不是内置的。
马丁·恩德

1
如果定义的fact(int n, int m) { return (n==0) ? 1 : (n*f(n-1)) % m; }话,即使是相当大的值,结果也不会溢出32位整数n。(m是模数)
apnorton 2015年

@anorton我想你的意思是(n*fact(n-1,m)) % m。这就突出了问题:您无法避免实现的递归,fact因为m外循环的每次迭代都会有所不同。
hvd 2015年

4

78 77个字符

(只是应用了一些其他语言学习的技巧。)

int i=0,p,c;for(;i<1e3;i++){c=0;for(p=2;p<i;)c+=i%p++<1;c||printf("%u\n",i);}

在C99模式下为76个字符

for(int i=0,p,c;i<1e3;i++){c=0;for(p=2;p<i;)c+=i%p++<1;c||printf("%u\n",i);}

2

58个字符(或完整程序为61个字符)

重复使用我对类似问题的回答
编辑:独立代码段,没有函数要调用。

for(int m,n=2;n<999;m>1?m=n%m--?m:n++:printf("%d\n",m=n));

完整程序:

n=2;main(m){n<999&&main(m<2?printf("%d\n",n),n:n%m?m-1:n++);}

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.