This commit is contained in:
timeshifter
2025-03-15 16:26:09 +01:00
parent 6de596faa8
commit 36cac2538c
2 changed files with 97 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
[package]
name = "euler26"
version = "0.1.0"
edition = "2021"
[dependencies]
itertools = "0.14.0"
rug = "*"
+89
View File
@@ -0,0 +1,89 @@
use itertools::Itertools;
use rug::Float;
const PRECISION: u32 = 16_192;
const MIN: usize = 2;
const MAX: usize = 1_000;
fn main() {
let mut largest_number = 1;
let mut largest_len = 1;
for number in MIN..MAX {
println!("{number}");
if let Some(value) = find_cycle_length(number as f64) {
if value > largest_len {
largest_len = value;
largest_number = number;
}
}
}
println!("{largest_number}: {largest_len}");
}
fn find_cycle_length(number: f64) -> Option<usize> {
let n = Float::with_val(PRECISION, 1.);
let d = Float::with_val(PRECISION, number);
let r = n / d;
let s = r.to_string();
let max_length = s.len() / 3;
let s = sanitize_string(s);
for skip in 0..max_length {
for length in 1..max_length {
let chunks = s.chars().skip(skip).chunks(length);
let mut iter = chunks.into_iter();
let first: String = iter.next().unwrap().collect();
let second: String = iter.next().unwrap().collect();
let third: String = iter.next().unwrap().collect();
if first == second && second == third {
return Some(length);
}
}
}
None
}
fn sanitize_string(s: String) -> String {
let exponent = s.chars().last().unwrap().to_digit(10).unwrap();
let mut s: String = s
.chars()
.take_while(|c| !c.is_ascii_lowercase())
.filter(|c| *c != '.')
.collect();
let add_leading_zeros = exponent - 1;
for _ in 0..add_leading_zeros {
s.insert(0, '0');
}
s
}
#[cfg(test)]
mod tests {
use crate::find_cycle_length;
#[test]
fn case_3() {
let result = find_cycle_length(3.);
assert_eq!(result, Some(1))
}
#[test]
fn case_6() {
let result = find_cycle_length(6.);
assert_eq!(result, Some(1))
}
#[test]
fn case_7() {
let result = find_cycle_length(7.);
assert_eq!(result, Some(6))
}
}