【问题标题】:Write a program that lists the sum of the first x palindromes编写一个列出前 x 个回文数之和的程序
【发布时间】:2015-11-16 02:33:14
【问题描述】:

我需要编写一个包含前 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 个数字中的回文数之和如何? >:)

【问题讨论】:

  • 回文是一个数字,如 11、22、101、334433、10201 等;可以向前和向后读取的任何数字。如果您指的是第一个问题,我正在寻找的程序将能够获取前 x 个回文并将它们加在一起。例如,如果我将 x 设置为 10,则程序将取 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101,然后将它们相加。
  • 欢迎来到 SO!试一试,如果您遇到特定问题,那么 SO 是一个很好的解决方案。听起来这是一项编程基础作业,这里的许多人宁愿帮助您了解是否有办法这样做,而无需简单地给出答案。
  • 这不是一个您发布家庭作业问题并期望人们为您解决问题的网站。这是一个网站,如果您表现出合理的努力,您将获得几乎无限的帮助,让您越过您不理解的部分。
  • 各位,不要对他太苛刻,让我们给他一个思路。他只是打算开始编程,我们都去过那里。 Vulcanis,我会给你一些基本的想法,希望能引导你找到解决方案。本网站不是为了寻求完整的解决方案。
  • @vulcanis,你的意思是到目前为止你写的代码,对吧?

标签: sequence fibonacci palindrome


【解决方案1】:

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

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

因此,我们缩小了问题空间。我们的新问题是:我们怎样才能找到下一个回文。你应该这样做:

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

编辑: 斐波那契数列前n个元素的回文数之和

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

function palindromesInFibo(nr)
    formerFormer <- -1
    former <- 1
    sum <- 0
    while nr > 0 do
        aux <- palindrome
        palindrome <- formerFormer + former
        formerFormer <- former
        former <- aux
        sum <- sum + palindrome
    end while
end function

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

另外,我必须强调的是,斐波那契数列中的前 n 个回文数和具有有限 n 的前 n 个斐波那契数中的回文数要求是折衷并指定我们严格或非严格地搜索正数回文数索引。如果我们不做出这种妥协,那么这些问题就没有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多