【问题标题】:R: number of trailing zeros of factorialR:阶乘的尾随零数
【发布时间】:2020-03-14 22:15:20
【问题描述】:

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

  • 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

...

我知道 R 中的 factorial 是计算阶乘,但我不知道如何计算尾随零。任何帮助将不胜感激!

【问题讨论】:

    标签: r factorial


    【解决方案1】:

    我认为您应该在计算尾随零的数量之前应用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
    

    【讨论】:

    • 沿着这些线,也许等价,将找到每个 k 从 2 到 n 的整数因子,然后计算 2 和 5 的幂。然后零的数量将是较小的分别是 2 和 5 的幂的总和。
    • @RobertDodier 是的,你是对的。其实我只是应用链接mathworld.wolfram.com/Factorial.html中的公式,但和你说的想法一样
    【解决方案2】:
    > 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
    

    【讨论】:

    • 感谢您的回答,但我想要factorials in x2
    • H1 的解决方案是准确的,我的帖子将计算所有的 0,而不仅仅是尾随的 0 - 可以开发它以获得类似的结果,但既然我们有一个好的解决方案,那就让它成为......跨度>
    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    相关资源
    最近更新 更多