素数を求める (ver.5)

明解C言語 入門編 > 5. 配列 >

素数を求める (ver.5)

C


#include <stdio.h>
int main(int argc, char* argv[])
{
int i, no;
int prime[15];
int ptr = 0;
unsigned long counter = 0;

prime[ptr++] = 2;
prime[ptr++] = 3;

for (no = 5; no <= 30; no += 2)
{
int j = 0;
for (i = 1; counter++, prime[i] * prime[i] <= no; i++)
{
counter++;
if (no % prime[i] == 0)
{
j = 1;
break; /* 割り切れるので、素数ではない */
}
}
if (!j)
prime[ptr++] = no; /* 最後まで割り切れなかったので、素数 */
}

for (i = 0; i < ptr; i++)
printf("%d\n", prime[i]);

printf("計算を行った回数:%lu\n", counter);

return 0;
}

実行結果


R:\>lesson042\project1.exe
2
3
5
7
11
13
17
19
23
29
計算を行った回数:34

Delphi


program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;
var
i, j, no: Integer;
prime: array[0..14] of Integer;
ptr: Integer = 0;
counter: Integer = 0;
begin
prime[ptr] := 2;
inc(ptr);

prime[ptr] := 3;
inc(ptr);

no := 5;
while (no <= 30) do
begin
j := 0;

i := 1;
while (true) do
begin
inc(counter);
if (prime[i] * prime[i] > no) then
break;

inc(counter);
if (no mod prime[i] = 0) then
begin
j := 1;
break; { 割り切れるので、素数ではない }
end;

inc(i);
end;

if j = 0 then
begin
prime[ptr] := no; { 最後まで割り切れなかったので、素数 }
inc(ptr);
end;

no := no + 2;
end;

for i := 0 to ptr - 1 do
begin
writeln(format('%d', [prime[i]]));
end;
writeln(format('計算を行った回数:%d', [counter]));
end.

実行結果


S:\>lesson042\project1.exe
2
3
5
7
11
13
17
19
23
29
計算を行った回数:34

Perl
@prime   = ();
$ptr     = 0;
$counter = 0;

$prime[$ptr++] = 2;
$prime[$ptr++] = 3;

$no = 5;
while ($no <= 30)
{
    $j = 0;
    for ($i = 1; $counter++, $prime[$i] * $prime[$i] <= $no; $i++)
    {
        $counter++;
        if ($no % $prime[$i] == 0)
        {
            $j = 1;
            last; # 割り切れるので、素数ではない
        }
    }
    $prime[$ptr++] = $no unless ($j); # 最後まで割り切れなかったので、素数

    $no += 2;
}

foreach $p(@prime)
{
    print "$p\n";
}    

print "計算を行った回数:$counter\n";

実行結果

L:\>perl lesson_05_042.pl
2
3
5
7
11
13
17
19
23
29
計算を行った回数:34

Ruby
prime   = []
counter = 0

prime[0] = 2
prime[1] = 3
ptr      = 2

no = 5
while (no <= 30)
    j = 0
    i = 1
    loop do
        counter += 1
        break if (prime[i] * prime[i] > no)

        counter += 1
        if (no % prime[i] == 0)
            j = 1
            break # 割り切れるので、素数ではない
        end
        i += 1
    end

    if (j == 0)
        prime[ptr] = no  # 最後まで割り切れなかったので、素数
        ptr += 1
    end

    no  += 2
end

prime.each do |p|
    print "#{p}\n"
end    

print "計算を行った回数:#{counter}\n"

実行結果

L:\>ruby l:\lesson_05_042.rb
2
3
5
7
11
13
17
19
23
29
計算を行った回数:34