74 lines
2.1 KiB
Zig
74 lines
2.1 KiB
Zig
const std = @import("std");
|
|
|
|
pub fn main(init: std.process.Init) !void {
|
|
const allocator = init.gpa;
|
|
const io = init.io;
|
|
|
|
var stdout_buffer: [1024]u8 = undefined;
|
|
var stdout = std.Io.File.stdout().writer(io, &stdout_buffer);
|
|
var output = &stdout.interface;
|
|
|
|
const nmax = getInput(io, "Please enter a maximum prime seek number") catch |err| {
|
|
try output.print("Error while acquiring number input: {}\n", .{err});
|
|
try output.flush();
|
|
return;
|
|
};
|
|
|
|
var primes = getPrimes(allocator, nmax) catch |err| {
|
|
try output.print("Failed to get primes: {}\n", .{err});
|
|
try output.flush();
|
|
return;
|
|
};
|
|
defer primes.deinit(allocator);
|
|
|
|
if (primes.items.len == 0) {
|
|
try output.writeAll("No prime numbers were found\n");
|
|
try output.flush();
|
|
return;
|
|
}
|
|
|
|
const last = primes.items[primes.items.len - 1];
|
|
try output.print("Displaying {d} prime numbers from 2 to {d}:\n", .{primes.items.len, last});
|
|
for (primes.items) |prime| {
|
|
try output.print("{d} ", .{prime});
|
|
}
|
|
try output.flush();
|
|
}
|
|
|
|
fn getInput(io: std.Io, message: []const u8) !usize {
|
|
var stdin_buffer: [100]u8 = undefined;
|
|
var stdout_buffer: [1024]u8 = undefined;
|
|
|
|
var stdin = std.Io.File.stdin().reader(io, &stdin_buffer);
|
|
var stdout = std.Io.File.stdout().writer(io, &stdout_buffer);
|
|
|
|
var line_buffer: [100]u8 = undefined;
|
|
var w: std.Io.Writer = .fixed(&line_buffer);
|
|
|
|
try stdout.interface.print("{s}: ", .{message});
|
|
try stdout.flush();
|
|
|
|
const line_length = try stdin.interface.streamDelimiterLimit(&w, '\n', .unlimited);
|
|
const input: []const u8 = line_buffer[0..line_length];
|
|
|
|
return std.fmt.parseInt(usize, input, 10);
|
|
}
|
|
|
|
fn getPrimes(allocator: std.mem.Allocator, n_max: usize) !std.ArrayList(usize) {
|
|
var primes: std.ArrayList(usize) = .empty;
|
|
|
|
for (2..n_max+1) |i| {
|
|
if (isPrime(i)) try primes.append(allocator, i);
|
|
}
|
|
|
|
return primes;
|
|
}
|
|
|
|
fn isPrime(n: usize) bool {
|
|
for (2..n) |i| {
|
|
if (n % i == 0) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|