代码之家  ›  专栏  ›  技术社区  ›  Ameya

大数字和

r
  •  0
  • Ameya  · 技术社区  · 6 年前

    我正在尝试创建一个函数,它计算大数字的位数之和,即 100^100 。本文描述的方法 question 不工作,如下所示。我试着想出一个能完成这项工作的功能,但没能走得很远。

    输入的形式为 a^b 在哪里 1 < a, b < 100 a b 是整数。所以,从这个意义上说,我愿意 digitSumLarge 接受两个参数的函数。

    digitSumLarge <- function(x) {
      pow <- floor(log10(x)) + 1L
      rem <- x
      i <- 1L
      num <- integer(length = pow)
      # Individually isolate each digit starting from the largest and store it in num
      while(rem > 0) {
        num[i] <- rem%/%(10^(pow - i))
        rem <- rem%%(10^(pow - i))
        i <- i + 1L
      }
      return(num)
    }
    # Function in the highest voted answer of the linked question.
    digitsum <- function(x) sum(floor(x / 10^(0:(nchar(x) - 1))) %% 10)
    

    考虑以下测试:

    x <- c(1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9)
    as.numeric(paste(x, collapse = ''))
    # [1] 1.234568e+17
    sum(x)
    # 90
    digitSumLarge(as.numeric(paste(x, collapse = '')))
    # 85
    digitsum(as.numeric(paste(x, collapse = '')))
    # 81, with warning message about loss of accuracy
    

    我能用R写这样一个函数吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Roland    6 年前

    您需要任意精度的数字。 a^b 使用r的数字(双精度浮点)只能用有限的精度表示,而不能精确表示足够大的输入。

    library(gmp)
    a <- as.bigz(13)
    b <- as.bigz(67)
    sum(as.numeric(strsplit(as.character(a^b), split = "")[[1]]))
    #[1] 328