2017-10-06 42 views

回答

3

在包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" 

或者寫自己的功能。我修改從here

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

    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

如果你想了許多從一個基站轉換成其他的你可以創建以下function.Here可以將數量從鹼轉化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) 

希望它有幫助。