獲取醜數 get ugly nums


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
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章