1
0
This commit is contained in:
2026-02-04 11:15:03 +08:00
commit 8b20a5dd21
125 changed files with 4177 additions and 0 deletions

66
problems/p26/src/main.rs Normal file
View File

@@ -0,0 +1,66 @@
// 分数分为有限小数与无限循环小数
//
// 除数不变,当被除数出现相同时,出现循环
use std::collections::HashSet;
fn div_to_vec(denominator: u32) -> Vec<u32> {
let mut remainder_set: HashSet<u32> = HashSet::new();
let deno_digits = denominator.to_string().len() as u32;
let mut remainder = 10u32.pow(deno_digits);
remainder_set.insert(1);
let mut xiaoshu = Vec::new();
let mut divider = remainder / denominator;
xiaoshu.push(divider);
remainder %= denominator;
remainder_set.insert(remainder);
while remainder != 0 {
remainder *= 10u32.pow(deno_digits);
divider = remainder / denominator;
xiaoshu.push(divider);
remainder %= denominator;
if remainder_set.contains(&remainder) {
remainder *= 10u32.pow(deno_digits);
divider = remainder / denominator;
xiaoshu.push(divider);
break;
}
remainder_set.insert(remainder);
}
xiaoshu
}
#[test]
fn test_div_to_vec() {
assert_eq!(div_to_vec(2), vec![5]);
assert_eq!(div_to_vec(4), vec![2, 5]);
assert_eq!(div_to_vec(5), vec![2]);
}
fn get_recurring_cycles(denominator: u32) -> u32 {
let xiaoshu = div_to_vec(denominator);
let last_element = xiaoshu[xiaoshu.len() - 1];
let first_idx = xiaoshu.iter().position(|x| x == &last_element).unwrap();
let result = xiaoshu.len() - 1 - first_idx;
result as u32
}
#[test]
fn test_get_recurring_cycles() {
assert_eq!(get_recurring_cycles(6), 1);
assert_eq!(get_recurring_cycles(7), 6);
assert_ne!(get_recurring_cycles(9), 1);
assert_eq!(get_recurring_cycles(11), 2);
assert_eq!(get_recurring_cycles(12), 1);
}
fn main() {
let mut longest_cycles = 0;
for denominator in 1..1000 {
let cycles = get_recurring_cycles(denominator);
if cycles > longest_cycles {
longest_cycles = cycles;
}
}
println!("longest_cycles: {longest_cycles}");
// FIX: answer incorrect
}