Problem 51 - Project Euler
最初問題の意味がよくわからなかった.一番大きな桁が0になる(00123とか)のは良いのかダメなのかというようなことが問題のスレッドでも何度か話題になっていたみたいだけど,どうも0になる場合は含めないのが正解らしい.
解けたには解けたけど,ギリ1分超える.なんとかしないと.
@00:00 あきらめた…
toDig <- function(n){ rev(floor(n/(10^(0:floor(log(n,10)))))%%10) } toNum <- function(n){ sum(n * 10^((length(n)-1):0)) } ## library(gmp) limit <- 10^6 sievebound <- (limit-1)/2 sieve <- logical(sievebound) crosslimit <- (floor(sqrt(limit))-1)/2 for(i in 1:crosslimit){ if(!sieve[i]){ for(j in seq(2*i*(i+1), sievebound, 2*i+1)){ sieve[j] <- TRUE } } } prime.list <- c(2, 2*(1:sievebound)[!sieve]+1) f <- function(){ pn <- 1 while(prime.list[pn] < 100) pn <- pn +1 frag <- 0 while(1){ dig.l <- floor(log(prime.list[pn],10)) cand2 <- toDig(prime.list[pn]) for(i in 1:dig.l){ dig.c <- combn(dig.l, i) for(j in 1:length(dig.c[1,])){ cand <- cand2 cand[dig.c[,j]] <- 0 cand <- rep(toNum(cand), 10) cand <- cand + sum(10^(length(cand2)-dig.c[,j]))*(0:9) if(cand[1] < toNum(cand2)){ if(sum(isprime(cand[2:10])) >= 2*8) return(cand) }else if(sum(isprime(cand)) >= 2*8){ return(cand) } } if(frag) break } if(frag)break pn <- pn+1 } }