100 Exercises To Learn Rust - 2.9 saturating 풀기

pub fn factorial(n: u32) -> u32 {
    let mut result = 1;
    for i in 1..=n {
        // overflowing과 wrapping을 사용하기 보다는
        // saturating multiliaction을 사용해 u32의 최댓값에서 멈추도록 하세요
        result *= i;
    }
    result
}

 

2.8에서 오버플로우 문제를 해결하기 위해 dev profile의 overflow-checks를 false로 설정했는데, 이는 전체 프로그램에 영향을 미치게 되므로 썩 좋은 방법은 아니다.

 

산술 연산마다 제공되는 wrapping 메서드를 이용할 수 있다.

혹은 saturating 메서드를 사용할 수 있는데, 래핑처럼 값을 넘겨버리는 대신, 타입의 최댓값 혹은 최솟값을 반환한다.

 

u8 타입의 255와 1을 더하더라도, saturating 메서드를 사용하면 최댓값인 255가 연산 결과가 된다.

 

해답:

pub fn factorial(n: u32) -> u32 {
    let mut result: u32 = 1;
    for i in 1..=n {
        //saturating_mul 메서드 사용
        result = result.saturating_mul(i);
    }
    result
}