負の数は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"
※コメント投稿者のブログIDはブログ作成者のみに通知されます