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。这是一个好的候选人吗?我该如何使用它?或者还有其他板条箱可以为我做这件事吗?
类型转换较少的衬垫是我正在寻找的理想解决方案。
您可以循环并检查在该数字变为一位数之前将该数字除以 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)
这是一个不需要字符串或浮点的单行代码:
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)