题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
题目分析:观察可以看出,2+22+222+2222+2222 可以看做是(2+22+222+2222)再加上22222。也就是说如果设数字为 3,个数为5,它的结果就等于前4个数(3+33+333+3333)计算出来的和再加5个3,即"33333"。我们首先要实现当用户输入3和5的时候,能够自动生成33333,输入3和4的时候能够生成3333,才能再想办法求和。
这一步怎么实现呢?2 其实可以看做是2x10º+0,22 可以看做是2x10¹+2x10º,222 可以看做是2x10²+2x10¹+2x10º,2222 可以看做是2x10³+2x10²+2x10¹+2x10º,这样我们这个函数就好定义了。先算2x10º,然后算2x10¹....
def get_num(n,m):#n为数字,m 为该数字的个数
result = 0
for i in range(m): #从n的0次方算到n的m次方
result = result + n*10**i #将上一次计算的结果与本次计算的结果相加。
return result
print(get_num(2,5))
#>>> 22222
#测试没有问题
但是,题目中最终要求的结果并不是求出 22222,而是要求出2+22+222+2222+22222 的总和。根据题目分析部分可以看出,这个问题可以用递归的思想来解决。具体逻辑就是结果始终等于前面一坨之和+最后生成的一个数字,于是函数我们就可以定义成这样:
#正式代码 Part-1
def add_(n,m):
current = 0
for i in range(m):
current += n*(10**i)
if m == 1:
return current
return current+add_(n,m-1)
最后,题目要求接受用户输入,为了简单,我们设置为用户在一行内输入这两个数,并用逗号隔开。注意,凡是需要接受用户输入的,都要考虑用户的输入是不是合法,有没有按照我们的规则进行输入,如果没有按照规格输入怎么处理等等。这里我们用 While + try+except来检查输入部分,如果输入不正确,直接返回要求用户重新输入:
#正式代码 Part-2
while True:
temp = input('请分别输入数字以及数字的个数,用英文逗号隔开:')
try:
n = int(temp.split(',')[0])
m = int(temp.split(',')[1])
except ValueError:
print(f'你输入的{temp}有误,请重新输入' )
continue
except IndexError:
print('输入错误')
continue
break
add_(n,m)