如何在Rust中计算21的阶乘?

6

我在项目中需要计算21的阶乘。

fn factorial(num: u64) -> u64 {
    match num {
        0 => 1,
        1 => 1,
        _ => factorial(num - 1) * num,
    }
}

fn main() {
    let x = factorial(21);
    println!("The value of 21 factorial is {} ", x);
}

运行此代码时,我遇到了一个错误:
thread 'main' panicked at 'attempt to multiply with overflow', src\main.rs:5:18
4个回答

13

u64 无法容纳21!(介于2^65和2^66之间),但是u128可以。


10
一种可能的实现方式可以是:
pub fn factorial(num: u128) -> u128 {
    (1..=num).product()
}


#[test]
fn factorial_of_21() {
   assert_eq!(51090942171709440000,factorial(21));
}

#[test]
fn factorial_of_0() {
   assert_eq!(1,factorial(0));
}


准时:我们可以使用u128计算34!== 295232799039604140847618609643520000000。;-) - Fabio Petrillo
为什么输入的num是u128而不是u8 - Daniel X Moore
1
因为 u128 没有实现 Product<u8> 特质。 - Fabio Petrillo
1
你也可以像这样写(1..num+1)(1..=num) @FabioPetrillo - Mohsen Bg

7

我需要在我的项目中计算21的阶乘。

21的阶乘无法适应64位整数。您需要一些任意精度算术(或bigint)库或者实现自己的库,或者使用128位整数或某些浮点数。

根据这个列表,您可以考虑使用ramp


2
我认为实现应该如下所示。
pub fn factorial(num: u128) -> u128 {
    (1..=num).product()
}

啊,所以问题就在于没有使用.product() - mkrieger1
1
最初的问题是阶乘函数使用了u64类型。我将分享创建此函数的最短和高效方法。 - Adriwan Kenoby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接