R,优化代码,找出最大的回文乘以两个3位数字

时间:2015-12-29 20:24:30

标签: r optimization

我正在努力解决Project Euler问题4.虽然我在stackoverflow上看到了关于这个问题的其他问题,但我还没有看到任何用R.写的问题。问题如下:

“回文数字读取两种方式相同。由两个2位数字的乘积制成的最大回文数为9009 = 91×99。找到由两个3位数字的乘积制成的最大回文。” / p>

为此,我写了两个函数。第一个genNums生成所有3位数字的产品,可以提供潜在的解决方案。第二个,findPalindromes,遍历第一个函数生成的列表,以查找回文产品。它还使用max函数来识别列表中最大的回文。

我是初学程序员,这段代码非常低效。 R能够很好地通过genNums,但它无法完成findPalindromes功能。它不会抛出任何错误 - 但它也无法通过函数工作并产生答案。我认为findPalindromes中的for循环可能结构不正确,但我不确定。在此先感谢您的帮助!

genNums <- function() {
  empty <- list()
  l <- c(100:999) #the question is only interested in three digit numbers.  Lowest three digit number is 100.
  for (i in l){
    result <- i * l  #,multiply each item in list l by list l to obtain the set of possible products
    empty <-  c(empty, result)  #concatonate the multiplication results into a list
  }#end for loop
  return(empty) 
}#end function

findPalindromes <- function(){
  full <- genNums()
  pals <- list()
  print("I made it through genNums")
  for (i in full){
    if (i == rev(i)){
    pals <- c(pals, i)
    }
  }#end for loop

  maximum <-  max(pals)
  print(c("The largest palindrome is " + maximu))
}#end function

2 个答案:

答案 0 :(得分:2)

is.palindrome <- function(x) {
        digits <- strsplit(as.character(x), "")[[1]]
        all(digits == rev(digits))
}

找到最大的3位数回文:

all_prods <- outer(1:999, 1:999)
p <- all_prods
p[] <- sapply(p, is.palindrome)
mx <- all_prods == max(all_prods[!!p])

col(all_prods)[mx]
[1] 913 993

#Test
913*993
[1] 906609

答案 1 :(得分:0)

首先你需要像这样的字符串反转功能:

strReverse <- function(x)
        sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")

然后你需要一个确定数字是否为回文的函数:

isPal <- function(y){
        x <- sprintf("%d",y)
        strReverse(x)==x
}

然后,您只需创建组合产品:

productList <- combn(1000, 2, function(x){x[[1]]*x[[2]]})

将isPal功能应用于它:

palList <- sapply(productList, function(p){isPal(p)})

选择最大的回文:

max(productList[palList])