pub fn nth_ugly_number(n: i32) -> i32 {
fn is_ugly_number(n: i32) -> bool {
let mut m = n;
while m % 5 == 0 {
m = m / 5;
}
while m % 3 == 0 {
m = m / 3;
}
while m % 2 == 0 {
m = m / 2;
}
m == 0 || m == 1
}
let mut i = 1;
let mut count = 0;
loop {
if is_ugly_number(i) {
count += 1;
if count == n {
return i;
}
}
i += 1;
}
}
fn get_ugly(n: i32) -> i32 {
if n < 1 {
return 0;
}
let mut ugly = vec![1];
let index = n as usize;
let mut i2 = 0;
let mut i3 = 0;
let mut i5 = 0;
for j in 0..index {
while ugly[i2] * 2 <= ugly[j] {
i2 += 1;
}
while ugly[i3] * 3 <= ugly[j] {
i3 += 1;
}
while ugly[i5] * 5 <= ugly[j] {
i5 += 1;
}
let m2 = ugly[i2] * 2;
let m3 = ugly[i3] * 3;
let m5 = ugly[i5] * 5;
let min = match m2 < m3 {
true => match m2 < m5 {
true => m2,
false => m5,
},
false => match m3 < m5 {
true => m3,
false => m5,
},
};
ugly.push(min);
}
ugly[index - 1] as i32
}