R:阶乘的尾随零数

R: number of trailing zeros of factorial

我试图计算给定数字的阶乘中尾随零的数量,例如

我的问题是,我有一个像 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