给定范围内的素数之和


27

编写最短的代码,以查找和之间的质数之ab

输入项

  1. a并且b可以从命令行或标准输入采取(空间分隔)
  2. 假设1 <= a <= b <=10 8

输出 只需用换行符打印总和即可。

奖励积分

  1. 如果程序接受多个范围(每行打印一个总和),您将获得加分。:)

上限太大,无法使用许多有趣的解决方案(至少必须在合理的时间内完成)。
hallvabo 2011年

@hallvabo您发现低效的解决方案很有趣吗?
马修(Matthew)

@hallvabo,没关系。我认为没有人会认为效率不高。如果其他人反对,我将很乐意降低该限制
2011年

刚制作并使用1到10 ^ 8在C#中运行了不是非常优化或简洁的程序版本。假设我的算法正确,它的运行时间不到1分30秒,并且没有长时间溢出。对我来说似乎是一个很好的上限!
Nellius

快速容易检查:质数的1和100之间的总和= 1060
Nellius

Answers:


15

J,41 32 19个字符:

更新资料

(简单的筛子)

g=:+/@(*1&p:)@-.&i.

例如

100 g 1
1060
250000x g 48
2623030823

以前

h=:3 :'+/p:i.(_1 p:>:y)'
f=:-&h<:

例如:

100 f 1
1060

11

Mathematica 7(纯文本31个字符)

如果允许使用PARI / GP解决方案,则:

Plus@@Select[Range[a,b],PrimeQ]

你想说什么?PARI / GP和Mathematica是优良的编程语言。
Eelvex 2011年

@Eelvex,不,它们违反了高尔夫规则之一:使用内置的特定高级功能
Nakilon

我认为没有这样的规定。何时使用高级功能仍然是一个悬而未决的问题。见前。这个元问题
Eelvex 2011年

1
28个字符Range[a,b]~Select~PrimeQ//Tr
chyanog

6

C(117,包括NL)

main(a,b,s,j){
s=0,scanf("%d%d",&a,&b);
for(a+=a==1;a<=b;a++)
for(s+=a,j=2;j<a;)
s-=a%j++?0:(j=a);
printf("%d",s);
}

5

C#(294个字符):

using System;class P{static void Main(){int a=int.Parse(Console.ReadLine()),b=int.Parse(Console.ReadLine());long t=0;for(int i=a;i<=b;i++)if(p(i))t+=i;Console.WriteLine(t);}static bool p(int n){if((n%2<1&&n!=2)||n<2)return 0>1;for(int i=3;i<=Math.Sqrt(n);i+=2)if(n%i==0)return 0>1;return 1>0;}}

你可以让你所有的int小号long和保存一些字符:long a=...,b=...,t=0,i=a;for(;i<=b;i++)。这使其达到288个字符。您还可以让plong返回,然后只返回0or或n将循环缩短到t+=p(i)。然后是277个字符。
乔伊,

5

PARI / GP(44个字符)

sum(x=nextprime(a),precprime(b),x*isprime(x))

6
失望的选民不应该为他们的-1给出理由吗?
Eelvex 2011年

下注可能是因为使用内置功能。
mbomb007

4

BASH外壳

47个字符

seq 1 100|factor|awk 'NF==2{s+=$2}END{print s}'

编辑:刚意识到总和溢出并且被强制为两倍。

52 50个字符

这是更长的解决方案,但也可以处理溢出

seq 1 100|factor|awk NF==2{print\$2}|paste -sd+|bc

tr比粘贴短,您可以删除单引号(转义$)。
Nabb 2011年

@Nabb,只要我将手放在* nix盒子上,便会修复它,否则您可以兑现荣誉。
st0le 2011年

@Nabb,无法使其正常工作,tr在末尾添加尾随“ +”,修复该问题将需要更多字符。
st0le 2011年

啊,错过了。尽管我认为您仍然可以更改以awk NF==2{print\$2}在较长的解决方案上节省一个字节(我们不会偶然遇到大括号扩展,因为没有逗号或..s)。
Nabb 2011年

@Nabb,你是对的。完成:)
st0le 2011年

4

C#,183个字符

using System;class P{static void Main(string[] a){long s=0,i=Math.Max(int.Parse(a[0]),2),j;for(;i<=int.Parse(a[1]);s+=i++)for(j=2;j<i;)if(i%j++==0){s-=i;break;}Console.WriteLine(s);}}

如果不需要检查1,或者如果有更好的方法...,则格式会短得多。

using System;
class P 
{ 
    static void Main(string[] a) 
    { 
        long s = 0,
             i = Math.Max(int.Parse(a[0]),2),
             j;

        for (; i <= int.Parse(a[1]);s+=i++)
            for (j = 2; j < i; )
                if (i % j++ == 0)
                {
                    s -= i;
                    break;
                }

        Console.WriteLine(s); 
    }
}

我喜欢这有多短,但是我想知道当计算10 ^ 8时效率会多么低!
Nellius

的确如此,但是效率并不是规则!
尼克·拉尔森

您知道编译器将数字默认为0吗?那会为您节省几个字符
jcolebrand 2011年

当没有它编译提示错误
尼克·拉尔森

...因为它从未在使用之前被分配(通过,s -= i;因为那只是在设置之前s = s - i;尝试访问的语法糖s
Nick Larsen

3

哈斯克尔(80)

c=u[2..];u(p:xs)=p:u[x|x<-xs,x`mod`p>0];s a b=(sum.filter(>=a).takeWhile(<=b))c

s 1 100 == 1060


这是代码高尔夫球!您为什么要使用这么长的名称?
FUZxxl 2011年

4
很难找到比c,u,s短的名称。其余的是语言标准库。
JB

3

Ruby 1.9,63个字符

require'prime';p=->a,b{Prime.each(b).select{|x|x>a}.inject(:+)}

这样使用

p[1,100] #=> 1060

使用Prime该类感觉就像是在作弊,但是由于Mathematica解决方案使用了内置的主要函数,因此...


3

Perl,62个字符

<>=~/\d+/;map$s+=$_*(1x$_)!~/^1$|(^11+)\1+$/,$&..$';print$s,$/

这个使用素数正则表达式。


3

普通任务(Python 3):95个字符

a,b=map(int,input().split())
r=range
print(sum(1%i*all(i%j for j in r(2,i))*i for i in r(a,b+1)))

红利任务(Python 3):119个字符

L=iter(map(int,input().split()))
r=range
for a,b in zip(L,L):print(sum(1%i*all(i%j for j in r(2,i))*i for i in r(a,b+1)))

3

Pari / GP(24个字符)

s=0;forprime(i=a,b,s+=i)

像一些其他的解决方案,这并不严格符合要求,a并且b不会从标准输入或命令行读取。我认为这是其他Pari / GP和Mathematica解决方案的不错替代方案。


1
+1:即使没有打高尔夫球,这也是我实际要做的方式。
查尔斯(Charles)

2

普通Lisp:(107个字符)

(flet((p(i)(loop for j from 2 below i never (= (mod i j) 0))))(loop for x from(read)to(read)when(p x)sum x))

仅适用于起点> = 1


2

APL(25个字符)

+/((R≥⎕)^~R∊R∘.×R)/R←1↓⍳⎕

这是一个众所周知的习惯用法的修改(请参见本页对用于在APL中生成素数列表的的说明)。

例:

      +/((R≥⎕)^~R∊R∘.×R)/R←1↓⍳⎕
⎕:
      100
⎕:
      1
1060

2

因素-> 98

:: s ( a b -- n )
:: i ( n -- ? )
n 1 - 2 [a,b] [ n swap mod 0 > ] all? ;
a b [a,b] [ i ] filter sum ;

输出:

( scratchpad ) 100 1000 s

--- Data stack:
75067

2

R,57个字符

a=scan();b=a[1]:a[2];sum(b[rowSums(!outer(b,b,`%%`))==2])

是否n=2需要在中指定scan()?如果输入是标准输入,则省略参数并假设需要额外的<enter>是否存在问题?
加菲2013年

1
没有,实际上你是对的,否则我做不到。纯粹是出于审美原因(因为我知道我的代码无论如何都不是最短的:))
plannapus

好吧,我的+1也是一样,因为它肯定不是最长的时间。
加菲2013年


1

Perl,103个字符

while(<>){($a,$b)=split/ /;for($a..$b){next if$_==1;for$n(2..$_-1){$_=0if$_%$n==0}$t+=$_;}print"$t\n";}

它会接受多行以空格分隔的行,并给出每个:D的答案


1

在Q(95)中:

d:{sum s:{if[2=x;:x];if[1=x;:0];$[0=x mod 2;0;0=min x mod 2+til floor sqrt x;0;x]}each x+til y}

用法示例:

q)d[1;100]
1060

1

C#302

using System;namespace X{class B{static void Main(){long x=long.Parse(Console.ReadLine()),y=long.Parse(Console.ReadLine()),r=0;for(long i=x;i<=y;i++){if(I(i)){r+=i;}}Console.WriteLine(r);}static bool I(long n){bool b=true;if(n==1){b=false;}for(long i=2;i<n;++i){if(n%i==0){b=false;break;}}return b;}}}

1

Mathematica,27岁

预定义ab

a~Range~b~Select~PrimeQ//Tr

作为函数(也是27):

Tr[Range@##~Select~PrimeQ]&

1

R(85个字符)

x=scan(nmax=2);sum(sapply(x[1]:x[2],function(n)if(n==2||all(n %% 2:(n-1)))n else 0))

效率极低!我很确定这需要O(n ^ 2)的时间。它可能会警告将双精度强制为逻辑。

消除混淆:

x <- scan(nmax=2)
start <- x[1]
end <- x[2]

#this function returns n if n is prime, otherwise it returns 0.
return.prime <- function(n) {
  # if n is 2, n is prime. Otherwise, if, for each number y between 2 and n, n mod y is 0, then n must be prime
  is.prime <- n==2 || all(n%% 2:(n-1))
  if (is.prime)
    n
  else
    0
} 
primes <- sapply(start:end, return.prime)
sum(primes)

1

Python 3.1(153个字符):

from sys import*
p=[]
for i in range(int(argv[1]),int(argv[2])):
 r=1
 for j in range(2,int(argv[2])):
  if i%j==0and i!=j:r=0
 if r:p+=[i]
print(sum(p))

1. from sys import*2 r=Truer=10Falseif i%j==0and i!=j:r=0if r:p+=[i]print(sum(p))
.-

您可以使用input()更短的文字。另外,您可以if i%j<1and改用吗?
mbomb007


1

05AB1E,5个字节

ŸDp*O

在线尝试!

Ÿ      Push the list [a, ..., b]
 D     Push a duplicate of that list
  p    Replace primes with 1 and everything else with 0
   *   Element-wise multiply the two lists [1*0, 2*1, 3*1, 4*0, ...]
    O  Sum of the final list of primes

0

Python:110个字符

l,h=map(int,raw_input().split())
print sum(filter(lambda p:p!=1 and all(p%i for i in range(2,p)),range(l,h)))

不包括在内。
jamylak 2012年

0

蟒蛇133

一点巫术:

x,y=map(int,raw_input().split())
y+=1
a=range(y)
print sum(i for i in[[i for a[::i]in[([0]*y)[::i]]][0]for i in a[2:]if a[i]]if i>=x)

-1(嗯,我还没有足够的代表可以降票),这在Python 2或3中无效,您不能指望输入会方便地包含引号。更改为raw_input或使用python 3 plz
jamylak

您可以删除y+=1,而使用range(y+1)([0]*-~y)[::i]保存一个字节(删除换行符)。而且,使用Python 3允许您使用input(),只要在后面加上括号print,即可删除4个字节,但增加1个字节。值得。
mbomb007

0

133个字符,Lua(没有is_prime内置函数)

for i=m,n,1 do
if i%2~=0 and i%3~=0 and i%5~=0 and i%7~=0 and i%11~=0 then
s=s+1
end
end
print(s)

在下面的示例中,我添加了“ print(i)”行以显示找到的所有素数,并在其末尾加总和:http : //codepad.org/afUvYHnm


“ a和b可以从命令行或stdin中获取”。数字可以通过哪种两种方式传递给您的代码?
manatwork

1
根据这13(任何东西)不是质数。
st0le

@ st0le根据逻辑13是“素数”(但是例如2不是)-另一方面13 * 13 = 169再次是“素数” ...
霍华德

0

PowerShell的-94

$a,$b=$args[0,1]
(.{$p=2..$b
while($p){$p[0];$p=@($p|?{$_%$p[0]})}}|
?{$_-gt$a}|
measure -s).sum

0

F#(141)

三分之一的代码用于解析输入。

let[|a;b|]=System.Console.ReadLine().Split(' ')
{int a..int b}|>Seq.filter(fun n->n>1&&Seq.forall((%)n>>(<>)0){2..n-1})|>Seq.sum|>printfn"%A"
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.