r-statistics-fanの日記

統計好きの現場の臨床医の覚書のようなもの

7を数える(訂正)

0を数える場合の部分を書き直した。

 

f5 <- function(suuji, z){
if (nchar(z) == 1) {
if (suuji == 0){
return(0)
}else{
return(as.numeric(as.numeric(z) >= suuji))}}
else{
x <- rev(as.numeric(unlist(strsplit(z, "")))) #分解してベクトルに
keta <- length(x) #計算する数の桁数
ans <- numeric(keta) #答えのベクトル

ans[1] <- ans[1] + as.numeric(x[1] >= suuji) #1桁目
#a桁目がb 未満の数まで何個含むか(a>=2):
for (i in 2:keta){
ans[i -1] <- ans[i - 1] + (i - 1) * x[i]
if (x[i] > suuji){
ans[i] <- ans[i] + 1
}else if(x[i] == suuji){
ans[1:(i-1)] <- ans[1:(i-1)] + x[1:(i-1)]
ans[1] <- ans[1] + 1
}
}

for (j in 1:(keta - 1)){
ans[j + 1] <- ans[j + 1] + floor(ans[j] %/% 10)
ans[j] <- ans[j] - floor(ans[j] %/% 10) * 10
}
if (suuji == 0){ #0の場合
ans <- numeric(keta)
for (i in 1:(keta - 1)){
ans[i] <- x[1 + i]
}
if (keta >= 3){
for (j in 1:(keta - 2)){
if (x[j + 1] != 0){
ans[(keta - 1):(j+1)] <- ans[(keta - 1):(j+1)] + x[(keta):(j+2)]
}else{
ans[(keta - 1):(j+1)] <- ans[(keta - 1):(j+1)] + x[(keta):(j+2)]
ans[j:1] <- ans[j:1] + x[j:1]
ans[1] <- ans[1] + 1
ans[j+1] <- ans[j+1] - 1

}}}
#くりさがり
for (j in 1:(keta - 1)){
if (ans[j] < 0){
ans[j + 1] <- ans[j + 1] - abs(ans[j] %/% 10)
ans[j] <- ans[j] + abs(ans[j] %/% 10) * 10
}
}
##くりあがり
for (j in 1:(keta - 1)){
ans[j + 1] <- ans[j + 1] + floor(ans[j] %/% 10)
ans[j] <- ans[j] - floor(ans[j] %/% 10) * 10
}

return(paste(rev(ans), collapse = "")) #0の場合の結果rev:逆むき
}

else{
return(paste(rev(ans), collapse = "")) #0以外の結果rev:逆むき
}
}
}

 

> simn <- 10000
> res <- matrix(9, nrow = simn, ncol = 2)
> for (i in 1:simn){
+ res[i,1] <- func1(i)
+ #res[i,1] <- func2(i)
+ res[i,2] <- as.integer(f5(0, as.character(i)))
+ }
>
> sum(res[,1] == res[,2])
[1] 10000

 

0の場合でも10000まで一致した。