RosettaCodeData/Task/Pseudo-random-numbers-Middle-square-method/Rust/pseudo-random-numbers-middle-square-method.rs
2025-06-11 20:16:52 -04:00

54 lines
1.1 KiB
Rust

use std::fmt;
#[derive(Debug)]
struct MiddleSquare {
state: u64,
div: u64,
modulo: u64,
}
impl MiddleSquare {
fn new(start: u64, length: u64) -> Result<Self, &'static str> {
if length % 2 != 0 {
return Err("length must be even");
}
let mut div = 1;
let mut modulo = 1;
for _ in 0..(length / 2) {
div *= 10;
}
for _ in 0..length {
modulo *= 10;
}
Ok(MiddleSquare {
state: start % modulo,
div,
modulo,
})
}
fn next(&mut self) -> u64 {
self.state = (self.state * self.state / self.div) % self.modulo;
self.state
}
}
impl fmt::Display for MiddleSquare {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "MiddleSquare {{ state: {}, div: {}, modulo: {} }}", self.state, self.div, self.modulo)
}
}
fn main() -> Result<(), &'static str> {
let mut msq = MiddleSquare::new(675248, 6)?;
for _ in 0..5 {
println!("{}", msq.next());
}
Ok(())
}