1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use num::{one, zero, Integer};
use std::convert::{From, Into};
use std::ops::{AddAssign, DivAssign, Mul, MulAssign};
pub fn scale_dight<T: Integer + DivAssign + Mul + From<u8>>(n: T) -> usize {
if n == zero() {
return 1;
}
let mut count = 0;
let mut n = n;
while n >= one() {
n /= one::<T>() * 10u8.into();
count += 1;
}
count
}
#[test]
fn test_scale() {
let a = 99i64;
assert!(2 == scale_dight(a));
let b = 0usize;
assert!(1 == scale_dight(b));
let c: num::BigInt = num::BigInt::from(21_746_284_928_973_i128);
assert!(14 == scale_dight(c));
}
pub fn scale_n_base<T: Integer + DivAssign + Mul + From<u8>>(n: T, base: u8) -> usize {
if n == zero() {
return 1;
}
let mut count = 0;
let mut n = n;
while n >= one() {
n /= one::<T>() * base.into();
count += 1;
}
count
}
#[test]
fn test_n_base_scale() {
let a = 99i64;
assert_eq!(7, scale_n_base(a, 2));
let b = 0usize;
assert_eq!(1, scale_n_base(b, 100));
let c: num::BigInt =
num::BigInt::from(21_746_284_928_973_i128) * num::BigInt::from(11_111_111_111_111_111_i128);
assert_eq!(35, scale_n_base(c, 7));
}
pub fn dight_vec<
T: std::ops::MulAssign + std::convert::From<u8> + std::ops::DivAssign + Integer + Copy,
>(
n: T,
) -> Vec<T> {
let mut idx = scale_dight(n) - 1;
let mut ret = Vec::new();
loop {
ret.push(n / pow_bin(10.into(), idx as u32) % 10.into());
if idx == 0 {
break;
}
idx -= 1;
}
ret
}
#[test]
fn vec_test() {
let a = dight_vec(12345usize);
assert_eq!(a, vec![1, 2, 3, 4, 5]);
}
pub fn dight_sum<
T: std::ops::MulAssign + std::convert::From<u8> + std::ops::DivAssign + Integer + Copy + AddAssign,
>(
n: T,
) -> T {
let mut res = zero();
for i in dight_vec(n) {
res += i;
}
res
}
#[test]
fn sum_test() {
let n = 1234;
assert_eq!(10, dight_sum(n));
}
pub fn pow_bin<T: Integer + MulAssign + Copy>(n: T, r: u32) -> T {
let mut res: T = one();
let mut a = n;
let mut n = r;
while n > 0 {
if n & 1 != 0 {
res *= a
}
a *= a;
n >>= 1;
}
res
}