RosettaCodeData/Task/Extensible-prime-generator/Zig/extensible-prime-generator-2.zig
2023-07-01 13:44:08 -04:00

68 lines
1.8 KiB
Zig

const std = @import("std");
const sieve = @import("sieve.zig");
const PrimeGen = sieve.PrimeGen;
const heap = std.heap;
const stdout = std.io.getStdOut().writer();
pub fn main() !void {
try part1();
try part2();
try part3();
}
// exercize 1: Print small primes
fn part1() !void {
var arena = heap.ArenaAllocator.init(heap.page_allocator);
defer arena.deinit();
var primes = PrimeGen(u8).init(&arena.allocator);
defer primes.deinit();
try stdout.print("The first 20 primes:", .{});
while (try primes.next()) |p| {
try stdout.print(" {}", .{p});
if (primes.count == 20)
break;
}
try stdout.print("\nThe primes between 100 and 150:", .{});
while (try primes.next()) |p| if (p >= 100 and p <= 150)
try stdout.print(" {}", .{p});
try stdout.print("\n", .{});
}
// exercize 2: count medium primes
fn part2() !void {
var arena = heap.ArenaAllocator.init(heap.page_allocator);
defer arena.deinit();
var primes = PrimeGen(sieve.autoSieveType(8000)).init(&arena.allocator);
defer primes.deinit();
var count: i32 = 0;
while (try primes.next()) |p| {
if (p > 8000)
break;
if (p > 7700)
count += 1;
}
try stdout.print("There are {} primes between 7700 and 8000.\n", .{count});
}
// exercize 3: find big primes
fn part3() !void {
var arena = heap.ArenaAllocator.init(heap.page_allocator);
defer arena.deinit();
var primes = PrimeGen(u32).init(&arena.allocator);
defer primes.deinit();
var c: u32 = 10;
while (try primes.next()) |p| {
if (primes.count == c) {
try stdout.print("The {}th prime is {}\n", .{ c, p });
if (c == 100_000_000)
break;
c *= 10;
}
}
}