|
发表于 2023-10-20 16:55:35
|
显示全部楼层
- $ time ./main
- 210
- real 0m0.001s
- user 0m0.000s
- sys 0m0.001s
复制代码- // count bits before 10^l
- fn cb(l: u32) -> u32 {
- if l == 0 {
- return 0;
- }
- 9 * 10u32.pow(l - 1) * l + cb(l - 1)
- }
- // 返回第i位所在的数字以及偏移量
- fn b2n(x: u32) -> (u32, u32) {
- let mut base_l = 1;
- while cb(base_l) < x {
- base_l += 1;
- }
- base_l -= 1;
- (
- (x - cb(base_l)) / (base_l + 1) + 10u32.pow(base_l) - 1,
- (x - cb(base_l)) % (base_l + 1),
- )
- }
- fn d(x: u32) -> u32 {
- let (b, mut i) = b2n(x);
- if i == 0 {
- return b % 10;
- }
- let mut y = b + 1;
- i = y.ilog10() + 2 - i;
- let mut r = 0;
- while i > 0 {
- r = y % 10;
- y /= 10;
- i -= 1;
- }
- r
- }
- fn main() {
- println!("{}", (0..=6).map(|x| d(10u32.pow(x))).product::<u32>())
- }
复制代码
测试
- #[cfg(test)]
- mod tests {
- use super::*;
- #[test]
- fn test_cb() {
- assert_eq!(cb(1), 9);
- assert_eq!(cb(2), 189);
- }
- #[test]
- fn test_b2n() {
- assert_eq!(b2n(8), (8, 0));
- assert_eq!(b2n(9), (9, 0));
- assert_eq!(b2n(100), (54, 1));
- assert_eq!(b2n(189), (99, 0));
- assert_eq!(b2n(191), (99, 2));
- assert_eq!(b2n(192), (100, 0));
- }
- #[test]
- fn test_d() {
- assert_eq!(d(1), 1);
- assert_eq!(d(12), 1);
- assert_eq!(d(13), 1);
- assert_eq!(d(100), 5);
- }
- }
复制代码 |
|