Python中的Kaprekar数字

时间:2015-06-05 17:22:52

标签: python

我已经解决了HackerRank上的问题,问题如下:

修改后的 Kaprekar 数字是一个带有d位数的正整数n,这样当我们将它的正方形分成两部分时 - 一个带有d个数字的右手棋子r和一个左手棋子l包含剩余的d或d-1个数字,这些数字的总和等于原始数字(即l + r = n)。

或者,修改后的Kaprekar数是正整数n,其中2d位(如果其位数是偶数)或2d + 1位(如果其位数是奇数),这样当我们将其平方分成两件,右手件r包含d或d + 1位数,左件l包含剩余的d位数,两件的总和等于原始数字。

我们需要在给定范围内找到Kaprekar数字。所以我写了下面这段代码:

def checkIsKaprekar( num ):
    string_num = str(num**2)
    if num == int(string_num[:len(string_num)//2]) + int(string_num[len(string_num)//2:]):
        return True

kaprekars = [ str(i) for i in range(int(input()),int(input())) if checkIsKaprekar(i) == True ]
print (' '.join(kaprekars))

上述解决方案的问题是当我们传递单位数字时,它们被转换成一个字符串,其中右半部分是数字本身,而左半部分是#39;'。现在我将这些字符串转换为 int (),这会抛出异常

为避免这种情况,我将代码更改为:

def checkIsKaprekar( num ):
    string_num = str(num**2)
    left_string = string_num[:len(string_num)//2]
    right_string = string_num[len(string_num)//2:]
    left_num = int(left_string) if left_string != '' else 0
    right_num = int(right_string) if right_string != '' else 0
    if num == left_num + right_num:
        return True

kaprekars = [ str(i) for i in range(int(input()),int(input())) if checkIsKaprekar(i) == True ]
print (' '.join(kaprekars))

但我不喜欢这段代码,尽管它确实解决了这个问题。如何调整原始代码以产生正确的输出?

链接到问题:https://www.hackerrank.com/challenges/kaprekar-numbers

如果字符串是'''

,我有什么方法可以指定默认值0

5 个答案:

答案 0 :(得分:0)

正如B.M.回答的那样。 int('0'+ string_num [:len(string_num)// 2])完美无缺。 int('0'+'')产生0。

答案 1 :(得分:0)

也许最干净的方法是定义这样的函数:

def to_int(s)
    return int(s) if s else 0

但在这种情况下可能不值得花费。

答案 2 :(得分:0)

通过整数解决整数问题通常很方便:

def kaprekar(n):
    l=1
    while l<=n : l*=10
    return n== (n*n)//l + (n*n)%l

[print(x,end=' ') for x in range(1,100) if kaprekar(x)]
# 1 9 45 55 99

答案 3 :(得分:0)

    def checkIsKaprekar( num ):
        if(num==1):
            return True
        elif((num**2)<15):
            return False
        string_num = str(num**2)
        if num == int(string_num[:len(string_num)//2]) + int(string_num[len(string_num)//2:]):
        return True

答案 4 :(得分:0)

通过测试给定范围内给定条件的每个数字,您可以找到给定范围内的Kaprekar数字。例如,

If Dir(flname) = "" Then
  Msgbox("File does not exist.")
  Exit Sub
End If

这将给出输出:

def print_Kaprekar_nums(start, end):
    for i in range(start, end + 1):
        # Get the digits from the square in a list:
        sqr = i ** 2
        digits = str(sqr)

        # Now loop from 1 to length of the number - 1, sum both sides and check
        length = len(digits)
        for x in range(1, length):
            left = int("".join(digits[:x])) 
            right = int("".join(digits[x:]))
            if (left + right) == i:
                print("Number: " + str(i) + "Left: " + str(left) + " Right: " + str(right))

print_Kaprekar_nums(150, 8000)