#character-set #base #conversion #decimal #convert #numeric #preserve

digits

自定义“数字”增量器,没有 u64 大小限制。类似于自定义字符集的计分板。

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 中使用

MIT/Apache

51KB
911

digits

Build Status crates.io version Documentation

Digits 是一个自定义字符基数数字序列器。这个包旨在实现无限字符进度。它将包含加法方法,如 addmul

这是对 base_custom 的扩展。

Rust 中最大的无符号数字类型是 u64。这可以被视为对 u∞ 的升级。它能计算到的限制是未知的,可能仅限于您的系统 RAM,如果您尝试达到无限大。

此包让您可以发明自己的数字系统,并在其上进行基本数学运算,包括

  • 加法
  • 乘法
  • 乘以幂
  • 以及使用 succpred_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 的正常值。想象一下,如果您发明了自己的数字基数和字符集,它可以用于很多方面!

目标/路线图

  1. 此库的第一个目标是线程安全,并且对于字符序列功能良好。

  2. 次要目标是性能,这可能随着时间的推移而改进。

  3. 第三个目标是享受重新发明数学和实验的乐趣。

许可

根据以下任一许可证授权

由您选择。

贡献

除非您明确声明,否则您有意提交以供包括在您的工作中的任何贡献,如Apache-2.0许可证中定义的,应按上述方式双重许可,不附加任何额外条款或条件。

依赖

~0–1.4MB
~32K SLoC