【问题标题】:Finding all palindromic numbers within a range查找范围内的所有回文数
【发布时间】:2013-04-30 19:26:37
【问题描述】:

我需要以下帮助:

编写一个函数(main),它会要求用户输入一个开始和结束的数字范围(包括)。使用 while 循环计算数字。仅当它是回文时才将数字添加到总数中(调用 isNumberPalindrome)。添加数字后打印总数。'

到目前为止,我对这个(主要)功能的了解是......

def main():
start = int(input("Enter a number to start counting at:"))
end = int(input("Enter a number to end counting at:"))
while start <= end:
    print(start)
    start = start + 1

这就是我的 (isNumberPalindrome) 函数。

def isNumberPalindrome(s):
if len(s) < 1:
        return True
else:
    if s[0] == s[-1]:
        return isNumberPalindrome(s[1:-1])
    else:
        return False

到目前为止,我的(主)函数要求用户输入(开始和结束数字)并使用 while 循环对它们进行计数。我不知道接下来要为(主)函数添加什么以实现“仅当它是回文时才将数字添加到总数中(调用 isNumberPalindrome)。添加数字后打印总数。”

感谢您的帮助。

到目前为止,提供给我的代码是这样的。

Enter a number to start counting at:1
Enter a number to end counting at:6
1
Traceback (most recent call last):
File "C:/Users/Tyler/Desktop/AWDADXC.py", line 38, in <module>
main()
File "C:/Users/Tyler/Desktop/AWDADXC.py", line 33, in main
if isNumberPalindrome(start):
File "C:/Users/Tyler/Desktop/AWDADXC.py", line 18, in isNumberPalindrome
if len(s) < 1:
TypeError: object of type 'int' has no len()

有谁知道怎么回事?

【问题讨论】:

  • 你应该正确缩进这两个函数的内容。

标签: python python-3.x palindrome


【解决方案1】:

这是一个简单的尝试:

def isNumberPalindrome(n):
    return str(n) == str(n)[::-1]
filter(isNumberPalindrome, range(10,100))

输出:

[11, 22, 33, 44, 55, 66, 77, 88, 99]

总结它们只需将序列传递给sum(),如下所示:

sum(filter(isNumberPalindrome, range(10,100)))

输出:

495

如果您想考虑用户输入,您可以这样做:

sum(filter(isNumberPalindrome, range(int(raw_input('Enter a starting number:')), int(raw_input('enter a stopping number:')))))

这将产生以下输出:

Enter a starting number:10
enter a stopping number:100
495

【讨论】:

    【解决方案2】:

    遍历从 startend 的所有整数:

    for n in range(start, end + 1):
        print(n)
    

    获取数字;你可以使用str(n):

    def is_palindrom(number):
        digits = str(number)
        return digits == digits[::-1]
    

    其中s[::-1] 反向返回字符串s,例如"abc"[::-1] == "cba"

    求 [start, end] 范围内所有回文的总和:

    total = sum(number for number in range(start, end + 1) if is_palindrom(number))
    

    【讨论】:

      【解决方案3】:

      您的代码的问题是您在一个整数上调用len。 您应该做的是在可迭代对象上调用 len,例如liststring (如答案中发布的解决方案)。

      例如,使用 isNumberPalindrome 的递归实现,

      >>> isNumberPalindrome("123321")
      True
      >>> isNumberPalindrome("HelloolleH")
      True
      >>> isNumberPalindrome(str(123321))
      True
      >>> isNumberPalindrome([1,2,3,4,3,2,1])
      True
      

      除此之外,如果不需要使用递归实现, 任何其他答案,都应该做的工作。

      【讨论】:

        【解决方案4】:

        你需要有一个变量来存储回文的总和。不仅仅是调用 if 语句来检查数字是否为回文,如果是,则将数字添加到总数中,否则什么也不做。

        PS:你可以使用另一个答案中提供的 Juampi 的代码。

        【讨论】:

          【解决方案5】:
          def main():
          start = int(input("Enter a number to start counting at:"))
          end = int(input("Enter a number to end counting at:"))
          total = 0
          while start <= end:
              print(start)
              if isNumberPalindrome(str(start)):
                  total += start
              start = start + 1
          print(total)
          

          【讨论】:

          • 因此,使用您的代码,我得到了在无限循环中打印的起始编号,而不是只得到回文总数。
          • 我没有删除数字的印刷,因为我认为你是故意的。但是,我没有得到这个代码的无限循环。我建议你检查你的缩进。
          【解决方案6】:

          您的问题是假设isNumberPalindrome 的参数是str,但您传递的是int

          无需转换为str 即可轻松检查回文。例如。

          def isNumberPalindrome(n):  # n is an integer
              s = n
              t = 0
              while s:
                  t = t*10 + s%10
                  s /= 10
              return n == t
          

          【讨论】:

            【解决方案7】:

            JavaScript - 解决方案。

            用输入数字指定范围


            function findPalindromes(number) {
            
                let palindromeCount = 0;
                let leftSide = '';
                let rightSide = '';
            
                for (let i = 1; i <= number; i++) {
            
                    let checkBox = [];
                    let s = i.toString();
            
                    for (let j = 0; j < s.length / 2; j++) {
                        leftSide = s[j];
                        rightSide = s[s.length - 1 - j];
            
                        if (rightSide === leftSide) {
                            checkBox.push('y');
                        } else {
                            checkBox.push('n');
                        }
                    }
            
                    if (!checkBox.includes('n') && i > 10) {
                        console.log(s);
                        palindromeCount++;
                    }
                }
            
                console.log(`TOTAL: ${palindromeCount} palindromes found`);
            }
            
            findPalindromes(1001);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-07-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-03-16
              相关资源
              最近更新 更多