a
との間の素数の合計を見つけるための最短コードを記述しますb
(包括的)。
入力
a
そして、b
、コマンドラインまたは標準入力から撮影することができます(スペースは区切り)1 <= a <= b <=
10 8と仮定する
出力 合計を改行文字で印刷するだけです。
ボーナスポイント
- プログラムが複数の範囲を受け入れる場合(各行に合計を1つ印刷する)、余分なポイントを取得します。:)
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
、longを返して、どちらか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;}}}
定義済みa
およびb
:
a~Range~b~Select~PrimeQ//Tr
関数として(また27):
Tr[Range@##~Select~PrimeQ]&
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を使用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。