1

我只是在练习 Python 并正在回答这个问题:

信息:有一个数的位数的平方反复求和得到的序列。如果序列在不到 15 步内收敛到 1,则该数字被认为是快乐数字。

问题:制作一个允许用户输入数字的程序,它会告诉他们输入的数字是否是快乐的数字。用户应该能够继续输入数字,直到输入 -1 以退出程序。

我试过这个问题,但有一个错误说

File "string", line 43, in fragment

TypeError: 'int' object is unsubscriptable

我知道错误是sequence_num += int(num[i]) ** 2我不明白为什么,因为在此之前,我将 num 转换为字符串,然后由于(num[i])在括号中,程序应该先运行,然后再将其转换为整数。知道为什么会发生这种情况和/或如何解决它。多谢你们。

#Constant to determine if number is happy
MAX_STEPS = 14
#Constants to signal end of sequences or program
END_SEQUENCE_NUM = 1
END_PROGRAM_NUM = -1
#Variable to count number of steps and digit number
steps = 0
i = 0
#Variable for sequence number
sequence_num = 0

#Loops until user inputs -1
while True:
#Gets values from user
    num = input("\nPlease input a number: ")

    #Checks if user entered -1 to end program
    if num == END_PROGRAM_NUM:

    #Ends program
    break

#Checks if user inputted a number besides -1
    else:

#Loops until the sequence converges to 1 or number of steps is greater than 15
        while num != END_SEQUENCE_NUM and steps < MAX_STEPS:
#Counts number of steps
            steps += 1
#Concatenates user's number into a string
            num = str(num)

#Gets number of digits of user's number
            num_digits = len(num) 

#Squares each digit and adds the product
        while i != num_digits:
            sequence_num += int(num[i]) ** 2
            i += 1

            num = sequence_num

#Checks if number is happy
if num == END_SEQUENCE_NUM:
    num_type = "happy"

else:
    num_type = "not happy"

print "This is a", num_type, "number."
4

2 回答 2

0

我的建议是:注意类型。

有时您希望该 num 变量是一个数字(例如,当您将其与那些常数进行比较时),有时是一个字符串(以便对其进行切片或获取它的长度)。另请注意,假设您使用的是 python 2.x ( http://docs.python.org/2/library/functions.html#input ),使用 input 会给您一个数字,通常建议使用 raw_input (您总是会得到一个字符串,没有 eval http://docs.python.org/2/library/functions.html#raw_input)。

也许打印类型可以帮助您调试:

print type(num)

快乐学习。

于 2013-04-03T04:58:35.417 回答
0

您当前的方法有点复杂。将其分解为简单的函数并使用for循环。Python 允许您使用循环轻松地迭代列表和字符串for

def squared_digit_sum(number):
    total = 0

    for digit in str(number):
        # `digit` is a string, so convert it into a number using `int()`

        ...

从那里,您只需要循环 15 次并查看数字是否在这 15 次迭代中收敛:

def is_happy(number):
    for i in range(15):
        number = squared_digit_sum(number)

        if number == 1:
            return True

    # The loop ended and `number` isn't 1
    return False
于 2013-04-03T03:05:24.060 回答