我已经解决了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答案 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)