28 lines
662 B
Rust
28 lines
662 B
Rust
|
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 })
|
||
|
}
|