25 个版本 (3 个稳定版本)
使用旧的 Rust 2015
1.1.1 | 2022 年 5 月 16 日 |
---|---|
1.1.0 | 2017 年 12 月 6 日 |
1.0.0 | 2017 年 11 月 1 日 |
0.3.9 | 2017 年 10 月 29 日 |
0.2.1 | 2017 年 7 月 30 日 |
#460 在 数据结构
在 abrute 中使用
51KB
911 行
digits
Digits 是一个自定义字符基数数字序列器。这个包旨在实现无限字符进度。它将包含加法方法,如 add
和 mul
。
这是对 base_custom 的扩展。
Rust 中最大的无符号数字类型是 u64。这可以被视为对 u∞ 的升级。它能计算到的限制是未知的,可能仅限于您的系统 RAM,如果您尝试达到无限大。
此包让您可以发明自己的数字系统,并在其上进行基本数学运算,包括
- 加法
- 乘法
- 乘以幂
- 以及使用
succ
和pred_till_zero
的简单 +1/-1 步骤 - 从版本 0.3 开始,Digits 在加法方法中保留零填充
您可以将此视为一个高度先进的计分板(字符序列),其中添加了基本数学方法,以帮助您按需通过序列。
安装
将以下内容添加到您的 Cargo.toml 文件中
[dependencies]
digits = "^1.0"
要使用它,请添加
extern crate digits;
use digits::prelude::*;
到您的文件中。
用法
创建 Digits 的新实例有多种方法,但在所有这些方法之前,您需要从 base_custom
包中定义您自己的数字基数。
// Define your own numeric base to use using a set of any characters
// We'll use the string representations for base 10 so you can see this
// work with something familiar.
let base10 = BaseCustom::<char>::new("0123456789".chars().collect());
// Once you have a custom numeric base defined you can create instances of Digits in many ways.
let hundred = Digits::new(base10.clone(), "100".to_string());
// If you don't want to have to pass the base value in each time you create a new number
// you can propagate a new one out with the `propagate` method.
let two = hundred.propagate("2".to_string()); // re-uses internal base10 mappings
// Now we have two instances of Digits created: one for 100 and one for 2
// The mathematical methods mutate the Digits instance they're called from
// so you need to either use `let mut` or call `clone` to use them.
hundred.clone().add(two).to_s() // outputs: "102"
hundred.clone().mul(two).to_s() // outputs: "200"
hundred.clone().pow(two).to_s() // outputs: "10000"
// There are several ways to create and check one or zero.
let one = Digits::new_one(&base10); // A Digits instance with the value of 1
one.is_one() // true
one.is_zero() // false
let zero = Digits::new_zero(&base10); // A Digits instance with the value of 0
zero.is_one() // false
zero.is_zero() // true
// And you can create a one or zero off of an existing Digits instance with `one` or `zero`
hundred.one() // A Digits instance with the value of 1
hundred.zero() // A Digits instance with the value of 0
// Count down or up with `pred_till_zero` and `succ`
let mut ten = Digits::new(base10.clone(), "10".to_string());
assert_eq!(ten.pred_till_zero().to_s(), "09");
assert_eq!(ten.pred_till_zero().to_s(), "08");
assert_eq!(ten.pred_till_zero().to_s(), "07");
let mut nine = Digits::new(base10.clone(), "9".to_string());
assert_eq!(nine.succ().to_s(), "10");
assert_eq!(nine.succ().to_s(), "11");
assert_eq!(nine.succ().to_s(), "12");
这仅仅使用从 0 到 9 的正常值。想象一下,如果您发明了自己的数字基数和字符集,它可以用于很多方面!
目标/路线图
-
此库的第一个目标是线程安全,并且对于字符序列功能良好。
-
次要目标是性能,这可能随着时间的推移而改进。
-
第三个目标是享受重新发明数学和实验的乐趣。
许可
根据以下任一许可证授权
- Apache许可证,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您有意提交以供包括在您的工作中的任何贡献,如Apache-2.0许可证中定义的,应按上述方式双重许可,不附加任何额外条款或条件。
依赖
~0–1.4MB
~32K SLoC