Files
CodeTest/baekjoon/분해합/solution_56552638.rs
2024-08-29 16:22:07 +09:00

61 lines
1.2 KiB
Rust

macro_rules! parse_line {
($t: ty) => ({
let mut line = String::new();
std::io::stdin().read_line(&mut line).unwrap();
line.trim().parse::<$t>().unwrap()
})
}
fn length(n: u32) -> u32{
n.to_string().len() as u32
}
fn biggest_generated(len : u32) -> u32{
10u32.pow(len) + 9 * len - 1
}
fn coeff(len : u32) -> u32{
10u32.pow(len - 1) + 1
}
fn min_div_sum(n: u32, len : u32) -> Option<u32>{
if len == 1 {
match n % 2 {
0 => return Some(n / 2),
_ => return None
}
}
let c = coeff(len);
let x = match n.checked_sub(biggest_generated(len - 1)){
Some(y) => y,
None => 0,
};
let mut start = match x % c {
0 => x,
m => x + (c - m),
};
while start <= n {
let a = start / c;
match min_div_sum(n - start, len - 1){
Some(m) => return Some(a * 10u32.pow(len - 1) + m),
_ => (),
}
start += c;
}
return None;
}
fn main(){
let n = parse_line!(u32);
let len = length(n);
match min_div_sum(n, len){
Some(i) => {println!("{}", i);},
None => {println!("0");},
}
}