我正在努力解决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
答案 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])