Python 值查找Kaprekar数时出错

Python 值查找Kaprekar数时出错,python,python-3.x,Python,Python 3.x,在数学中,给定基数的Kaprekar数是一个非负整数,其在该基数中的平方表示可以分成两部分,再加起来等于原始数。例如,45是Kaprekar数,因为45²=2025,20+25=45。 我想打印两个整数p和q之间的所有卡普雷卡数 错误: 编译器消息: Runtime Error Error(stderr) : Traceback (most recent call last): File "solution.py", line 26, in <module> kapreka

在数学中,给定基数的Kaprekar数是一个非负整数,其在该基数中的平方表示可以分成两部分,再加起来等于原始数。例如,45是Kaprekar数,因为45²=2025,20+25=45。
我想打印两个整数p和q之间的所有卡普雷卡数

错误: 编译器消息:

Runtime Error
Error(stderr) : 
Traceback (most recent call last):
File "solution.py", line 26, in <module>
    kaprekarNumbers(p, q)
  File "solution.py", line 17, in kaprekarNumbers
    if int(p1) + int(p2) == int(i):
ValueError: invalid literal for int() with base 10: ''
运行时错误
错误(stderr):
回溯(最近一次呼叫最后一次):
文件“solution.py”,第26行,在
卡普雷卡数(p,q)
文件“solution.py”,第17行,以Kaprekar数字表示
如果int(p1)+int(p2)==int(i):
ValueError:基数为10的int()的文本无效:“”

非常感谢您的帮助。

如果
p
是[0,3]范围内的整数,因此其平方是一个单位数整数,那么您对平方字符串版本的拆分将为
p1
生成一个空字符串。int(“”)是一个错误。在尝试转换之前,必须检查该值:

if len(square) >= 2:
    # Put your existing code here;
    # If square is only a single digit, there's no use splitting the result.
更好的是,覆盖一位数的大小写,这样您就可以选择
1
作为有效数字:

    if p1 == '':
        p1 = '0'       # Force a leading zero.
    if int(p1) + int(p2) == int(i):

这里有一个更高级的实现(当您更熟悉Python时)

code.py:


您得到了什么错误?此代码甚至没有尝试将任何字符串转换为浮点。请发布一个完整、准确的堆栈跟踪。欢迎使用StackOverflow。请按照您创建此帐户时的建议,阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。已编辑!在正文中添加了错误。请将错误作为文本编辑到问题正文中。即使我已纠正了此错误,我仍收到另一个错误
回溯(最近一次调用):文件“solution.py”,第26行,在kaprekarNumbers(p,q)文件“solution.py”中,第14行,在kaprekarNumbers p1中,p2=square[:len(square)/2],square[len(square)/2:]TypeError:切片索引必须是整数或无,或者具有_索引_方法

您能建议代码中的一些改进吗。谢谢:D不应该是“范围[1:3]”吗?实际上,根据正式定义,0是允许的。
    if p1 == '':
        p1 = '0'       # Force a leading zero.
    if int(p1) + int(p2) == int(i):
import sys


def kaprekar(n, base=10):
    #if i <= 0:
    #    return False
    square = n ** 2
    splitter = base
    while True:
        div, mod = divmod(square, splitter)
        if mod and div + mod == n:
            return True
        if splitter >= square:
            return False
        splitter *= base
    return False


def print_kaprekars(p, q, base=10):
    for i in range(p, q):
        if kaprekar(i, base=base):
            print(i)


def main():
    lo = 0
    hi = 1000
    base = 10
    print("Printing Kaprekar numbers (!!! base 10 representation !!!) between {:d} and {:d} in base {:d}".format(lo, hi, base))
    print_kaprekars(lo, hi, base=base)


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()
(py35x64_test) e:\Work\Dev\StackOverflow\q050846444>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32

Printing Kaprekar numbers (!!! base 10 representation !!!) between 0 and 1000 in base 10
1
9
45
55
99
297
703
999