gpt4 book ai didi

rust - 如何创建一个对各种整数类型通用的 is_prime 函数?

转载 作者:行者123 更新时间:2023-11-29 07:40:36 25 4
gpt4 key购买 nike

我刚刚开始研究 Rust,想制作一些通用的基本数学函数。我有以下 is_prime 函数:

fn is_prime(n: i64) -> bool {
if n == 2 || n == 3 {
return true;
} else if n % 2 == 0 || n % 3 == 0 {
return false;
}

let mut i = 5i64;
let mut w = 2i64;
while i*i <= n {
if n % i == 0 {
return false;
}
i += w;
w = 6 - w;
}
true
}

我需要什么才能将 isizei64usize 等作为参数传递?我已经阅读了 Rust guide在主页上,但我不确定如何将特征的想法应用到我的目标中。

最佳答案

通用数字类型使用起来可能会很麻烦,但是一旦掌握了它们,它们就不会太糟糕,尽管有点冗长。此类方法的标准构建 block 是 the num crate 中的特征来自 crates.io,最著名的是 Num , Zero One ,以及标准库的 std::cmp::PartialOrd .

数字字面量不能泛型于任何数字类型;它们必须通过特征方法调用来完成; Zero::zero() One::one() 对于大多数目的来说就足够了——这里我们想要的数字是 0、1、2、3、5 和 6,这些数字显然可以通过这些构建 block 实现。您还可以使用生成这些值的静态方法创建您自己的特征,并为您喜欢的任何数字类型实现它,但只使用 Num 保证的内容来实现是一个更好的主意。

基本过程是将泛型类型参数指定为基于 Num (和 PartialOrd 如果您在该类型的值上写不等式,例如 i * i <= n ),并将任何数字文字替换为从零和一构造的数字文字,如半打 let以下方法开头的语句演示了。这通常就足够了。

以下是您针对此特定方法的最终结果:

// You’ll also need the appropriate dependencies.num addition to Cargo.toml
extern crate num;

use num::Num;

fn is_prime<N: Num + PartialOrd + Copy>(n: N) -> bool {
let _0 = N::zero();
let _1 = N::one();
let _2 = _1 + _1;
let _3 = _2 + _1;
let _5 = _2 + _3;
let _6 = _3 + _3;
if n == _2 || n == _3 {
return true;
} else if n % _2 == _0 || n % _3 == _0 {
return false;
}

let mut i = _5;
let mut w = _2;
while i * i <= n {
if n % i == _0 {
return false;
}
i = i + w;
w = _6 - w;
}
true
}

关于rust - 如何创建一个对各种整数类型通用的 is_prime 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26810793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com