R:阶乘的尾随零数
R: number of trailing zeros of factorial
我试图计算给定数字的阶乘中尾随零的数量,例如
6!=720
,其中有 1
尾随零
10!=3628800
,其中有 2
个尾随零
我的问题是,我有一个像 df <- data.frame(n=1:50)
这样的数据框,我如何添加另一列来给出尾随零的数量,例如,
n trail0s
1 1 0
2 2 0
3 3 0
4 4 0
5 5 1
6 6 1
7 7 1
8 8 1
9 9 1
10 10 2
...
我知道 factorial
在 R 中是计算阶乘,但我不知道如何计算尾随零。如有任何帮助,我们将不胜感激!
> library(stringi)
> x1<- c(1:7)
> x2 <- c(10,20,200,220, 50,300,7000)
> df<- data.frame(x1,x2)
> df$x0trail <- stri_count(df$x2, regex="0")
> df
x1 x2 x0trail
1 1 10 1
2 2 20 1
3 3 200 2
4 4 220 1
5 5 50 1
6 6 300 2
7 7 7000 3
我认为你应该在计算尾随零的数量之前应用 factorial
的一些数学性质,请参阅 https://mathworld.wolfram.com/Factorial.html
在factorial(n)
中,你应该知道尾随零的数量取决于级联乘积1*2*...*n
中的2*5
对。在这种情况下,您可以像下面这样定义自定义函数 zeros
zeros <- Vectorize(function(n) ifelse(n>=5,sum(sapply(seq_along(floor(logb(n,5))), function(p) floor(n/5**p) )),0))
然后您可以通过
添加尾随零列
df <- within(df,trail0s <- zeros(n))
这样
> df
n trail0s
1 1 0
2 2 0
3 3 0
4 4 0
5 5 1
6 6 1
7 7 1
8 8 1
9 9 1
10 10 2
11 11 2
12 12 2
13 13 2
14 14 2
15 15 3
16 16 3
17 17 3
18 18 3
19 19 3
20 20 4
21 21 4
22 22 4
23 23 4
24 24 4
25 25 5
26 26 5
27 27 5
28 28 5
29 29 5
30 30 6
31 31 6
32 32 6
33 33 6
34 34 6
35 35 7
36 36 7
37 37 7
38 38 7
39 39 7
40 40 8
41 41 8
42 42 8
43 43 8
44 44 8
45 45 9
46 46 9
47 47 9
48 48 9
49 49 9
50 50 10
我试图计算给定数字的阶乘中尾随零的数量,例如
6!=720
,其中有1
尾随零10!=3628800
,其中有2
个尾随零
我的问题是,我有一个像 df <- data.frame(n=1:50)
这样的数据框,我如何添加另一列来给出尾随零的数量,例如,
n trail0s
1 1 0
2 2 0
3 3 0
4 4 0
5 5 1
6 6 1
7 7 1
8 8 1
9 9 1
10 10 2
...
我知道 factorial
在 R 中是计算阶乘,但我不知道如何计算尾随零。如有任何帮助,我们将不胜感激!
> library(stringi)
> x1<- c(1:7)
> x2 <- c(10,20,200,220, 50,300,7000)
> df<- data.frame(x1,x2)
> df$x0trail <- stri_count(df$x2, regex="0")
> df
x1 x2 x0trail
1 1 10 1
2 2 20 1
3 3 200 2
4 4 220 1
5 5 50 1
6 6 300 2
7 7 7000 3
我认为你应该在计算尾随零的数量之前应用 factorial
的一些数学性质,请参阅 https://mathworld.wolfram.com/Factorial.html
在factorial(n)
中,你应该知道尾随零的数量取决于级联乘积1*2*...*n
中的2*5
对。在这种情况下,您可以像下面这样定义自定义函数 zeros
zeros <- Vectorize(function(n) ifelse(n>=5,sum(sapply(seq_along(floor(logb(n,5))), function(p) floor(n/5**p) )),0))
然后您可以通过
添加尾随零列df <- within(df,trail0s <- zeros(n))
这样
> df
n trail0s
1 1 0
2 2 0
3 3 0
4 4 0
5 5 1
6 6 1
7 7 1
8 8 1
9 9 1
10 10 2
11 11 2
12 12 2
13 13 2
14 14 2
15 15 3
16 16 3
17 17 3
18 18 3
19 19 3
20 20 4
21 21 4
22 22 4
23 23 4
24 24 4
25 25 5
26 26 5
27 27 5
28 28 5
29 29 5
30 30 6
31 31 6
32 32 6
33 33 6
34 34 6
35 35 7
36 36 7
37 37 7
38 38 7
39 39 7
40 40 8
41 41 8
42 42 8
43 43 8
44 44 8
45 45 9
46 46 9
47 47 9
48 48 9
49 49 9
50 50 10