值查找Kaprekar数时出错

2024-05-19 16:09:51 发布

您现在位置:Python中文网/ 问答频道 /正文

In mathematics, a Kaprekar number for a given base is a non-negative integer, the representation of whose square in that base can be split into two parts that add up to the original number again. For instance, 45 is a Kaprekar number, because 45² = 2025 and 20+25 = 45.
I want to print all Kaprekar numbers between two integers p and q

def kaprekarNumbers(p, q):
    for i in range(int(p),int(q)):
        square = str(i ** 2)
        if len(square) % 2 == 0:
            p1 , p2 = square[:len(square)/2] , square[len(square)/2:]
        else:
            p1 , p2 = square[:int(len(square)/2)] , square[int(len(square)/2) :]
        if int(p1) + int(p2) == int(i):
            print(i , end = '')

错误: 编译器消息:

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: ''

感谢您的帮助。你知道吗


Tags: theinnumberforbaselenifthat
2条回答

如果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时)。你知道吗

代码.py

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()

注意事项:

  • kaprekar函数:
    • 测试一个数是否满足Kaprekar条件
    • 支持10以外的基(默认)
    • 一切都是数学上的(没有字符串转换或解析-这样你就不会遇到当前错误,而且速度更快)
      • 平方数中的“位置”由splitter(向右->;向左)保持,这两部分用[Python]: divmod(a, b)计算
  • 剩下的只是包装纸

输出

(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

相关问题 更多 >