裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

多倍長足し算(引き算も)

2014年10月02日 | ブログラミング

負の数は10の補数とするので,引き算もできる

N <- 31 # 符号を含めた桁数
Add <- function(a, b) {
    carry <- function(s) {
        for (i in 1:N) {
            if (s[i] > 9) {
                s[i+1] <- s[i+1]+1
                s[i] <- s[i]-10
            }
        }
        return(s)
    }
    decomp <- function(s) {
        if (sign <- grepl("^-", s)) s <- sub("^-", "", s)
        s <- rev(tail(c(rep(0, 31), as.integer(unlist(strsplit(s, "")))), 31))
        if (sign) {
            s <- 9-s
            s[1] <- s[1]+1
            s <- carry(s)
        }
        return(s)
    }
    c <- carry(decomp(a)+decomp(b))
    sign <- ""
    if (c[N] == 9) {
        sign <- "-"
        c <- 9-c
        c[1] <- c[1]+1
        c <- carry(c)
    }
    length(c) <- N
    c <- paste(sign, sub("^0+", "", paste(rev(c), collapse="")), sep="")
    if (c == "") c <- "0"
    return(c)    
}

> Add("1234", "3456")
[1] "4690"
> Add("1234", "-3456")
[1] "-2222"
> Add("-1234", "3456")
[1] "2222"
> Add("-1234", "-3456")
[1] "-4690"
> Add("99999999", "99999997")
[1] "199999996"



コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村