100-days-of-rust/Week-05/Day-30_The-Maximum-Value/day30/src/lib.rs

28 lines
662 B
Rust
Raw Normal View History

2024-08-24 11:05:51 +00:00
pub fn max_value(mut n: isize, digit: char) -> Result<isize, String> {
let digit = match digit.to_digit(10) {
Some(d) => Ok(d as isize),
None => Err("The digit is not valid"),
}?;
let negative = n < 0;
if negative {
n *= -1;
}
let nlen = (n.abs() as f32).log10().floor() as u32 + 1;
let mut max = n * 10 + digit;
let cmp = if negative {
std::cmp::min
} else {
std::cmp::max
};
for i in 1..=nlen {
let option = (n / 10isize.pow(i) * 10 + digit) * 10isize.pow(i) + n % 10isize.pow(i);
max = cmp(max, option);
}
Ok(if negative { -max } else { max })
}