a
및 사이에 소수의 합을 찾기위한 가장 짧은 코드를 작성하십시오 b
.
입력
a
및b
명령 줄이나 표준 입력에서 취할 수 있습니다 (공간 구분)1 <= a <= b <=
10 8 가정
출력 개행 문자로 합계를 인쇄하십시오.
보너스 포인트
- 프로그램이 여러 범위를 허용하는 경우 (각 줄에 하나의 합계를 인쇄) 추가 점수를 얻습니다. :)
a
및 사이에 소수의 합을 찾기위한 가장 짧은 코드를 작성하십시오 b
.
입력
a
및 b
명령 줄이나 표준 입력에서 취할 수 있습니다 (공간 구분)1 <= a <= b <=
10 8 가정출력 개행 문자로 합계를 인쇄하십시오.
보너스 포인트
답변:
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
긴을 반환하고 단지 중 하나를 반환 0
또는 n
과에 루프를 단축 t+=p(i)
. 그러면 277 자입니다.
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
)
fj<space>
가 유용 할 수 있습니다.
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
3) if i%j==0and i!=j:r=0
4. if r:p+=[i]
5. print(sum(p))
(을 대체 마지막 4 선)
input()
더 짧게 사용할 수 있습니다. 또한 if i%j<1and
대신 사용할 수 있습니까?
Ÿ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
약간의 마법 :
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
and instead use range(y+1)
and ([0]*-~y)[::i]
to save a byte (removing the newline). And using Python 3 will allow you to use input()
, as long as you put parentheses after print
, therefore removing 4 bytes, but adding 1. Worth it.
133 chars, Lua (no is_prime in-built function)
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)
Here's an example where I added the line "print(i)" to display all primes found and the sum at the end of them: http://codepad.org/afUvYHnm.