Skip to content

Commit 0b85918

Browse files
committed
atcoder B26 - Output Prime Numbers SieveOfEratosthenes
1 parent 94f850e commit 0b85918

10 files changed

Lines changed: 731 additions & 0 deletions

File tree

Algorithm/PrimeNumber/SieveOfEratosthenes/atCoder/A26.go renamed to Algorithm/PrimeNumber/SieveOfEratosthenes/atCoder/A26/A26.go

File renamed without changes.

Algorithm/PrimeNumber/SieveOfEratosthenes/atCoder/A26.js renamed to Algorithm/PrimeNumber/SieveOfEratosthenes/atCoder/A26/A26.js

File renamed without changes.

Algorithm/PrimeNumber/SieveOfEratosthenes/atCoder/A26.php renamed to Algorithm/PrimeNumber/SieveOfEratosthenes/atCoder/A26/A26.php

File renamed without changes.

Algorithm/PrimeNumber/SieveOfEratosthenes/atCoder/README.md renamed to Algorithm/PrimeNumber/SieveOfEratosthenes/atCoder/A26/README.md

File renamed without changes.
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
// 以下は、Go 1.20.6 を用いた `N 以下の素数を小さい順に出力する` 問題の解法です。
2+
// エラトステネスの篩を用い、関数化・型明示・処理時間・メモリ計測を行っています。
3+
4+
// ---
5+
6+
// ## ✅ 実装コード(`main.go`)
7+
8+
package main
9+
10+
import (
11+
"bufio"
12+
"fmt"
13+
"os"
14+
"strconv"
15+
// "time"
16+
// "runtime"
17+
)
18+
19+
/**
20+
* sieveOfEratosthenes は N 以下のすべての素数を小さい順に列挙します。
21+
*
22+
* @param n int: 上限値(2 <= n <= 10^6)
23+
* @return []int: n 以下の素数を昇順で格納したスライス
24+
*/
25+
func sieveOfEratosthenes(n int) []int {
26+
if n < 2 {
27+
return []int{}
28+
}
29+
30+
isPrime := make([]bool, n+1)
31+
for i := 2; i <= n; i++ {
32+
isPrime[i] = true
33+
}
34+
35+
for i := 2; i*i <= n; i++ {
36+
if isPrime[i] {
37+
for j := i * i; j <= n; j += i {
38+
isPrime[j] = false
39+
}
40+
}
41+
}
42+
43+
primes := make([]int, 0)
44+
for i := 2; i <= n; i++ {
45+
if isPrime[i] {
46+
primes = append(primes, i)
47+
}
48+
}
49+
return primes
50+
}
51+
52+
func main() {
53+
// 入力の読み取り
54+
scanner := bufio.NewScanner(os.Stdin)
55+
scanner.Scan()
56+
N, _ := strconv.Atoi(scanner.Text())
57+
58+
// 計測開始
59+
// start := time.Now()
60+
// var memStatsStart, memStatsEnd runtime.MemStats
61+
// runtime.ReadMemStats(&memStatsStart)
62+
63+
// 素数列挙
64+
primes := sieveOfEratosthenes(N)
65+
66+
// 出力(高速化のため bufio.Writer 使用)
67+
writer := bufio.NewWriter(os.Stdout)
68+
for _, p := range primes {
69+
fmt.Fprintln(writer, p)
70+
}
71+
writer.Flush()
72+
73+
// 計測終了
74+
// runtime.ReadMemStats(&memStatsEnd)
75+
// duration := time.Since(start)
76+
77+
// stderr に時間・メモリ使用量を出力
78+
// fmt.Fprintf(os.Stderr, "Execution Time: %v\n", duration)
79+
// fmt.Fprintf(os.Stderr, "Memory Used: %.2f MB\n", float64(memStatsEnd.Alloc-memStatsStart.Alloc)/1024/1024)
80+
}
81+
// ```
82+
83+
// ---
84+
85+
// ## 🧪 実行例
86+
87+
// ### ✅ 入力
88+
89+
// ```
90+
// 20
91+
// ```
92+
93+
// ### ✅ 出力(stdout)
94+
95+
// ```
96+
// 2
97+
// 3
98+
// 5
99+
// 7
100+
// 11
101+
// 13
102+
// 17
103+
// 19
104+
// ```
105+
106+
// ### ✅ stderr 出力(例)
107+
108+
// ```
109+
// Execution Time: 430.12µs
110+
// Memory Used: 0.45 MB
111+
// ```
112+
113+
// ---
114+
115+
// ## 📌 解説
116+
117+
// | 項目 | 内容 |
118+
// | ------ | ------------------------------- |
119+
// | 処理時間計測 | `time.Now()` + `time.Since()` |
120+
// | メモリ計測 | `runtime.ReadMemStats()`(バイト単位) |
121+
// | 入力処理 | `bufio.Scanner` を使用(標準入力) |
122+
// | 出力処理 | `bufio.Writer` による高速出力(標準出力) |
123+
// | 時間計算 | `time.Duration` をマイクロ秒またはミリ秒で表示 |
124+
// | メモリ計算 | 差分(使用メモリ増分)を `MB` 単位で表示 |
125+
126+
// ---
127+
128+
// ## ✅ アルゴリズム情報
129+
130+
// * 時間計算量:`O(N log log N)`
131+
// * 空間計算量:`O(N)`(bool配列)
132+
133+
// ---
134+
135+
// ## 🛠️ コンパイルと実行方法
136+
137+
// ```bash
138+
// go build main.go
139+
// echo 1000000 | ./main
140+
// ```
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// 以下は、JavaScript(Node.js 18.16.1)で**エラトステネスの篩**を用いて、`N` 以下の素数をすべて出力するコードです。
2+
// 標準入力は `fs.readFileSync` を使用し、実行時間とメモリ使用量を意識して最適化されています。
3+
4+
// ---
5+
6+
// ### ✅ 実装:`sieveOfEratosthenes(N: number): number[]`
7+
8+
// ```javascript
9+
// Node.jsで標準入力から値を読み込む
10+
const fs = require('fs');
11+
12+
// 入力の読み取り
13+
const input = fs.readFileSync('/dev/stdin', 'utf8');
14+
const N = parseInt(input.trim(), 10);
15+
16+
/**
17+
* N 以下のすべての素数を小さい順に列挙する関数(エラトステネスの篩)
18+
* @param {number} n - 上限値(2 <= n <= 10^6)
19+
* @returns {number[]} - 素数の配列(昇順)
20+
*/
21+
function sieveOfEratosthenes(n) {
22+
const isPrime = new Array(n + 1).fill(true); // 初期状態はすべて素数と仮定
23+
isPrime[0] = isPrime[1] = false; // 0と1は素数ではない
24+
25+
for (let i = 2; i * i <= n; i++) {
26+
if (isPrime[i]) {
27+
for (let j = i * i; j <= n; j += i) {
28+
isPrime[j] = false;
29+
}
30+
}
31+
}
32+
33+
const primes = [];
34+
for (let i = 2; i <= n; i++) {
35+
if (isPrime[i]) primes.push(i);
36+
}
37+
38+
return primes;
39+
}
40+
41+
// 処理の実行と出力
42+
const result = sieveOfEratosthenes(N);
43+
console.log(result.join('\n'));
44+
45+
// ### ⏱️ 処理時間・メモリの目安(最大入力 N=1,000,000 時)
46+
47+
// * **計算量**:O(N log log N)
48+
// * **空間量**:O(N)(`isPrime` 配列使用)
49+
50+
// ---
51+
52+
// ### 🧪 入力例
53+
54+
// ```txt
55+
// 20
56+
// ```
57+
58+
// ### ✅ 出力例
59+
60+
// ```txt
61+
// 2
62+
// 3
63+
// 5
64+
// 7
65+
// 11
66+
// 13
67+
// 17
68+
// 19
69+
// ```
70+
71+
// ---
72+
73+
// 必要であれば、`/dev/stdin` を別のファイル名に変更することでローカルでのテストも可能です(例: `input.txt`)。その場合は `fs.readFileSync('input.txt', 'utf8')` に変更してください。
74+
75+
// ご希望があれば、処理時間やメモリ使用量の測定コード(`console.time`, `process.memoryUsage`)も追加可能です。
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
<!-- 以下は、**PHP 8.2.8** を使用した `N 以下の素数を列挙する` 問題の解法です。
2+
エラトステネスの篩アルゴリズムを使い、**高速化のために標準出力をまとめて出力**する形式とし、**関数化+型指定**+**処理時間・メモリ使用量の計測**を含めています。
3+
4+
---
5+
6+
## ✅ PHPコード(`Main.php`)
7+
8+
<?php
9+
declare(strict_types=1);
10+
11+
/**
12+
* エラトステネスの篩で N 以下の素数を列挙する関数
13+
*
14+
* @param int $n 素数の上限(2 <= $n <= 10^6)
15+
* @return array<int> 昇順の素数リスト
16+
*/
17+
function sieve_of_eratosthenes(int $n): array {
18+
if ($n < 2) return [];
19+
20+
$isPrime = array_fill(0, $n + 1, true);
21+
$isPrime[0] = $isPrime[1] = false;
22+
23+
for ($i = 2; $i * $i <= $n; $i++) {
24+
if ($isPrime[$i]) {
25+
for ($j = $i * $i; $j <= $n; $j += $i) {
26+
$isPrime[$j] = false;
27+
}
28+
}
29+
}
30+
31+
$primes = [];
32+
for ($i = 2; $i <= $n; $i++) {
33+
if ($isPrime[$i]) {
34+
$primes[] = $i;
35+
}
36+
}
37+
38+
return $primes;
39+
}
40+
41+
// 入力の読み込み
42+
fscanf(STDIN, "%d", $N);
43+
44+
// 計測開始
45+
$start = hrtime(true);
46+
47+
// 素数の列挙
48+
$primes = sieve_of_eratosthenes($N);
49+
50+
// 出力を高速化(implodeでまとめて表示)
51+
echo implode("\n", $primes) . "\n";
52+
53+
// 計測終了と時間・メモリ表示(stderrへ)
54+
$end = hrtime(true);
55+
$time = ($end - $start) / 1e6; // ミリ秒
56+
57+
fwrite(STDERR, sprintf("Execution Time: %.3f ms\n", $time));
58+
fwrite(STDERR, sprintf("Memory Usage: %.2f MB\n", memory_get_peak_usage(true) / 1024 / 1024));
59+
60+
// ## ✅ 実行方法
61+
62+
// ```bash
63+
// php Main.php < input.txt
64+
// ```
65+
66+
// ---
67+
68+
// ## 🧪 入力例
69+
70+
// ```txt
71+
// 20
72+
// ```
73+
74+
// ### ✅ 出力
75+
76+
// ```txt
77+
// 2
78+
// 3
79+
// 5
80+
// 7
81+
// 11
82+
// 13
83+
// 17
84+
// 19
85+
// ```
86+
87+
// ### ✅ stderr(参考)
88+
89+
// ```
90+
// Execution Time: 1.230 ms
91+
// Memory Usage: 1.00 MB
92+
// ```
93+
94+
// ---
95+
96+
// ## 🧠 解説ポイント
97+
98+
// | 項目 | 内容 |
99+
// | ------ | ---------------------------------------- |
100+
// | アルゴリズム | エラトステネスの篩:O(N log log N) |
101+
// | メモリ使用量 | `O(N)`(`$isPrime` 配列) |
102+
// | 高速化策 | 出力を `implode("\n", $primes)` で一括出力 |
103+
// | 時間計測 | `hrtime(true)` で高精度に処理時間をミリ秒単位で計測 |
104+
// | メモリ計測 | `memory_get_peak_usage(true)` を使用(バイト単位) |
105+
106+
// ---
107+
108+
// ## 💬 補足
109+
110+
// * `declare(strict_types=1)` により、型の厳格さを保っています。
111+
// * 出力は `echo` でまとめて表示 → `print` より高速。
112+
// * メモリ削減の余地は小さいですが、必要なら `bitset` 的表現も可能です。
113+

0 commit comments

Comments
 (0)