获取int的长度

Ath*_*har 3 rust

int我正在尝试获取rust的长度(以十进制解释时的位数) 。我找到了一种方法来做到这一点,但是我正在寻找来自原语本身的方法。这就是我所拥有的:

let num = 90.to_string();
println!("num: {}", num.chars().count())
// num: 2
Run Code Online (Sandbox Code Playgroud)

我正在查看https://docs.rs/digits/0.3.3/digits/struct.Digits.html#method.length。这是一个好的候选人吗?我该如何使用它?或者还有其他板条箱可以为我做这件事吗?

类型转换较少的衬垫是我正在寻找的理想解决方案。

Dan*_*iel 7

您可以循环并检查在该数字变为一位数之前将该数字除以 10 的频率。或者在另一个方向(因为除法比乘法慢),检查您可以相乘的频率,10*10*...*10直到达到该数字:

fn length(n: u32, base: u32) -> u32 {
    let mut power = base;
    let mut count = 1;
    while n >= power {
        count += 1;
        if let Some(new_power) = power.checked_mul(base) {
            power = new_power;
        } else {
            break;
        }
    }
    count
}
Run Code Online (Sandbox Code Playgroud)

从 rust 1.67 开始,您可以使用:

n.checked_ilog10().unwrap_or(0) + 1
Run Code Online (Sandbox Code Playgroud)

  • 编译器有时会比您想象的更积极地进行转换。事实证明,当使用编译时常量 10 调用我的“length”函数时,根本不会乘以任何值;它[只是变成了一系列“if”语句](https://godbolt.org/z/E7W365vfM) (3认同)

use*_*342 5

这是一个不需要字符串或浮点的单行代码:

println!("num: {}", successors(Some(n), |&n| (n >= 10).then(|| n / 10)).count());
Run Code Online (Sandbox Code Playgroud)

它只是计算初始数字需要除以 10 才能达到 0 的次数。


编辑:这个答案的第一个版本来自iterate(优秀且强烈推荐)itertools板条箱,但@trentcl指出successors来自stdlib的作用相同。作为参考,这里是使用的版本iterate:

println!("num: {}", iterate(n, |&n| n / 10).take_while(|&n| n > 0).count().max(1));
Run Code Online (Sandbox Code Playgroud)