编写一个程序,列出前x个回文总和

时间:2015-08-22 04:28:53

标签: sequence fibonacci palindrome

我需要编写一个具有前x个回文总和的程序。我真的完全不知道该怎么做。有人可以写一个程序(任何语言,但请注明)这样做吗?

目前,我可以用这个Haskell程序打印出前9000个回文。我怎么能编辑它以便它产生所有前9000个回文而不是第x个回文?

prefixes 0 = [[k] | k <-['1'..'9']]
prefixes n = [k:s | s <- prefixes (n-1), k <- ['0'..'9']]
p n = 
  [ reverse s ++ tail s | s <- prefixes n ] ++
  [ reverse s ++ s | s <- prefixes n ] ++ 
  p (n+1)
allpals = [[]] ++ p 0

main = do print (allpals !! 9000)

奖金挑战:斐波纳契序列的前x个数中的回文总和怎么样? &GT;:)

1 个答案:

答案 0 :(得分:0)

让我们先看看第一个问题。假设你有一个函数返回作为参数接收的回文的下一个回文。如果你有这样的功能,你可以这样做:

selectedNode.Nodes

因此,我们减少了问题空间。我们的新问题是:我们如何才能找到下一个回文。这就是你应该这样做的方式:

  • 检查回文数字
  • 如果是奇数,则检查中间数字。如果它小于9,则将一个加到中间数字并保持其他数字不变
  • 如果它是奇数,但其中间数字是9,则取数字的前半部分,包括中间数字,并在此数字上加1。如果数字位数没有增加,则反转结果的前半部分(不包括中间数字),这将是下半部分
  • 如果它是奇数,但它的中间数字是9并且在前半部分加1之后,包括中间数字增加了数字,那么你反转前半部分(在这种情况下,包括中间数字)和这将是下半年
  • 如果不是奇数,则取上半部分并增加它。如果数字的位数没有增加,那么将其反转,这将是下半部分
  • 如果它不是奇数,并且在增加之后数字的位数增加,那么反转数字,这将是下半部分,你需要一个新的0到中间

编辑: 来自斐波那契序列中前n个元素的回文总和

您可以使用Binet's formula获取第n个Fibonacci数并将结果四舍五入到最接近的整数,或者您可以递归计算它。如果选择Binet的公式,那么建议使用Phi和phi的当前使用功率,并将它们分别与Phi和phi相乘。如果你选择传统方式(在这种特殊情况下是可取的),那么你需要有两个前斐波纳契数。无论如何,这是应该如何做的(我在我的解决方案中选择了传统方式):

function getPalindromeSum(nr)
    sum <- 0
    palindrome <- 0
    while (nr > 0) do
        sum <- sum + palindrome
        palindrome <- nextPalindrome(palindrome)
        nr <- nr - 1
    end while
    return palindrome
end function

另外,如果你想要对Fibonacci序列中的前n个回文求和,你只需要相应地改变你的while条件。

此外,我必须强调,Fibonacci序列中的前n个回文和前n个Fibonacci数中具有有限n要求的回文需要妥协,并指明我们严格或非严格地搜索阳性阳性索引。如果我们不妥协,那么这些问题就没有意义了。