Problem 4

Problem 4 - Project Euler
総当たりしたときのスピードが段違い。

R

## 総当たり 17秒程度
reverse <- function(n){
  sum(rev(floor(n/(10^(0:floor(log(n,10)))))%%10)*10^(0:floor(log(n,10))))
}
pal.chk <- function(x){
  x == reverse(x)
}
max.pal <- function(){
  ans <- 0
  for(i in 998:100){
    for(j in 999:i){
      if(pal.chk(i*j) && ans < i*j){
        ans <- i*j
        break
      }
    }
  }
  return(ans)
}

## 解答pdf参考 30ms程度
reverse2 <- function(n){
  reversed = 0
  while(n > 0){
    reversed = 10*reversed + n%%10
    n = floor(n/10)
  }
  return(reversed)
}
pal.chk2 <- function(n){
  n==reverse2(n)
}
lp.chk <- function(){
  largestPalindrome = 0
  a = 999
  while(a >= 100){
    if((a %% 11)==0){
      b = 999;
      db = 1;
    }else{
      b = 990;
      db = 11;
    }
    while(b >= a){
      if((a*b) <= largestPalindrome) break()
      if(pal.chk2(a*b)) largestPalindrome = a*b
      b = b-db
    }
    a = a-1
  }
  return(largestPalindrome)
}

Ruby

総当たりのみ。1秒程度。何かもっとRubyっぽく書けるメソッドがある気がする。

def high_pld
  ans = 0
  998.downto(100) do |i|
    999.downto(i) do |j|
      ans = i*j if (i*j).to_s==(i*j).to_s.reverse && ans<i*j
    end
  end
  return ans
end