如何在R中对n进制数进行数学运算

4

我想在三进制中进行一些计算,并且需要用到加法和减法。例如,2+2在三进制中应该变成11。

3个回答

4
sfcmisc包中有一个名为digitsBase的函数,可以进行此类转换。
library(sfcmisc)
digitsBase(2+2,base = 3)

# Class 'basedInt'(base = 3) [1:1]
#      [,1]
# [1,]    1
# [2,]    1

3

您可以使用gmp

library(gmp)
as.character(x = as.bigz(2 + 2), b = 3)
#[1] "11"

或者写自己的函数。我修改了这里的一个函数。

foo = function(dec_n, base){
    BitsInLong = 64
    Digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    if (base < 2 | base > nchar(Digits)){
        stop(paste("The base must be >= 2 and <= ", nchar(Digits)))
    }

    if (dec_n == 0){
        return(0)
    }

    index = BitsInLong
    currentNumber = abs(dec_n)
    charArray = character(0)

    while (currentNumber != 0){
        remainder = as.integer(currentNumber %% base)
        charArray = c(charArray, substr(Digits, remainder + 1, remainder + 1))      
        currentNumber = currentNumber/base
    }

    charArray = inverse.rle(with(rle(rev(charArray)), list(values = if(values[1] == "0"){values[-1]}else{values},
                                                           lengths = if(values[1] == "0"){lengths[-1]}else{lenghts})))

    result = paste(charArray, collapse = "")
    if (dec_n < 0){
        result = paste("-", result)
    }
    return(result)
}

使用

foo(dec_n = 2+2, base = 3)
#[1] "11"

0
如果您想将一个数字从一种进制转换为另一种进制,可以创建以下函数。在这里,您可以将一个数字从2到36进制转换为2到36进制:
baseconverter <- function(number,baseGiven,baseRequire){
  result = c()
  if(baseRequire >36 || baseRequire<2 || baseGiven>36 || baseGiven<2){
    return ("CustomError:Base is not proper")
  }

  Letters = LETTERS[seq( from = 1, to = 26 )]
  numbers = 0:9
  L = c(numbers,Letters)
  rm(numbers)
  rm(Letters)
  number = substring(number,1:nchar(number),1:nchar(number))


  convertToAlpha <- function(a) {
    return(L[a+1])
  }
  alphaToDecimal <- function(a){
    k = match(x = a , table = L )
    return(k-1)
  }

  tempNum = 0
  for (i in rev(number)){
    digit = alphaToDecimal(i)
    if(digit >= baseGiven || digit < 0){
      return ("CustomError:Number is not proper")
    }
    tempNum = (tempNum*baseGiven) + digit
  }

  while(tempNum > baseRequire - 1){
    result = c(convertToAlpha(tempNum - (baseRequire * floor(tempNum/baseRequire))),result)
    tempNum = floor(tempNum/baseRequire)
  }
  result=c(tempNum,result)
  return(paste(result,collapse = ""))
}

你可以使用以下函数将m进制数转换为n进制数:
baseconverter(number = 2+2 , baseGiven = 10 , baseRequire = 3)

希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接