编写最短的代码,以查找和之间的质数之a
和b
。
输入项
a
并且b
可以从命令行或标准输入采取(空间分隔)- 假设
1 <= a <= b <=
10 8
输出 只需用换行符打印总和即可。
奖励积分
- 如果程序接受多个范围(每行打印一个总和),您将获得加分。:)
编写最短的代码,以查找和之间的质数之a
和b
。
输入项
a
并且b
可以从命令行或标准输入采取(空间分隔)1 <= a <= b <=
10 8输出 只需用换行符打印总和即可。
奖励积分
Answers:
如果允许使用PARI / GP解决方案,则:
Plus@@Select[Range[a,b],PrimeQ]
Range[a,b]~Select~PrimeQ//Tr
。
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个字符。您还可以让p
long返回,然后只返回0
or或n
将循环缩短到t+=p(i)
。然后是277个字符。
PARI / GP(44个字符)
sum(x=nextprime(a),precprime(b),x*isprime(x))
seq 1 100|factor|awk 'NF==2{s+=$2}END{print s}'
编辑:刚意识到总和溢出并且被强制为两倍。
这是更长的解决方案,但也可以处理溢出
seq 1 100|factor|awk NF==2{print\$2}|paste -sd+|bc
$
)。
tr
在末尾添加尾随“ +”,修复该问题将需要更多字符。
awk NF==2{print\$2}
在较长的解决方案上节省一个字节(我们不会偶然遇到大括号扩展,因为没有逗号或..
s)。
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);
}
}
s -= i;
因为那只是在设置之前s = s - i;
尝试访问的语法糖s
)
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
s=0;forprime(i=a,b,s+=i)
像一些其他的解决方案,这并不严格符合要求,a
并且b
不会从标准输入或命令行读取。我认为这是其他Pari / GP和Mathematica解决方案的不错替代方案。
普通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
+/((R≥⎕)^~R∊R∘.×R)/R←1↓⍳⎕
这是一个众所周知的习惯用法的修改(请参见本页对用于在APL中生成素数列表的的说明)。
例:
+/((R≥⎕)^~R∊R∘.×R)/R←1↓⍳⎕
⎕:
100
⎕:
1
1060
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;}}}
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)
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))
from sys import*
2 r=True
r=1
0
False
if i%j==0and i!=j:r=0
if r:p+=[i]
print(sum(p))
input()
更短的文字。另外,您可以if i%j<1and
改用吗?
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)))
一点巫术:
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)
y+=1
,而使用range(y+1)
和([0]*-~y)[::i]
保存一个字节(删除换行符)。而且,使用Python 3允许您使用input()
,只要在后面加上括号print
,即可删除4个字节,但增加1个字节。值得。
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。