类型错误:** 或 pow() 不支持的操作数类型:"int"和"set"



问题:在不使用任何字符串方法的情况下,尝试打印以下内容:123…n请注意,"表示介于两者之间的连续值。

示例n=5打印12345。

我的解决方案

n = int(input())
sum=0
i=n
while i>0:
sum=sum + i*(10**{n-i})
i -= 1
print(sum)   

第一:如果n=0,{n-i}将求值为{-1},因为{x}是在python 中表示集合的方法

第二:您要求方法打印数字字符串,但没有字符串操作(所以所有的串联都应该在两个整数之间进行加法运算(。这里我假设接受的输入只能是正数

例如:

  • 输入5,输出=1234
  • 输入12,输出=12346789101112

当学习解决这种"挑战"问题时,最好是测试驱动:编写一个简单的程序,然后与生成的预期结果进行比较/断言

这是生成输出的正确但不可接受的方式(使用字符串操作(:

inp = int(input())
expected = ""
for i in range(1, inp+1):
expected = expected + str(i)
print(expected)

然后尝试逐步解决:假设只输入个位数。在这里,我们得到了一个想法,为了把一个数字放在另一个数字旁边,我们需要把第一个数字乘以10,然后把下一个数字乘以1。所以你的解决方案,使它乘以10的幂已经在正确的轨道

现在我们可以写:

inp = int(input())
result = 0
for i in range(1, inp+1):
power_of_ten = 10**(inp-i)
print("pot", power_of_ten)
result = result + (i*power_of_ten)
print("r", result)
print(result)

输出:

5
pot 10000
r 10000
pot 1000
r 12000
pot 100
r 12300
pot 10
r 12340
pot 1
r 12345
12345

在这一点上,我们可以尝试断言我们的输出是否与我们生成的输出(使用字符串操作的输出(相同:

inp = int(input())
result = 0
for i in range(1, inp+1):
power_of_ten = 10**(inp-i)
result = result + (i*power_of_ten)
print(result)
expected = ""
for i in range(1, inp+1):
expected = expected + str(i)
print(expected)
assert(result == int(expected))
print("assertion passed")

输出:

5
12345
12345
assertion passed

但如果我们使用两位数的输入,输出将不再正确:

12
123456790122
123456789101112
Traceback (most recent call last):
File "/tmp/c.py", line 14, in <module>
assert(result == int(expected))
AssertionError

因此,如果我们在输入12时必须输出123456789101112,那么我们需要一个数学函数(而不是字符串函数(来计算数字中的位数:

  • 如果我们输入12、40、99、80(两位数(,则输出2
  • 如果我们输入1、5、2(一位数(,则输出1
  • 等等

这样的函数称为对数函数:例如:

math.floor(math.log(i, 10)) + 1

首先,我们尝试将输入以10为底对数,然后对结果进行底数运算(这样结果就不是十进制/小数(;然后我们添加1个

这是包含这一点的代码:注意,为了简单起见,我们向后循环(例如:12,11,10,9..1(

import math
inp = int(input())
result = 0
pad = 0
for i in range(inp, 0, -1):
result = result + i*10**pad
pad = pad + math.floor(math.log(i, 10)) + 1
print(result)
expected = ""
for i in range(1, inp+1):
expected = expected + str(i)
print(expected)
assert(result == int(expected))
print("assertion passed")

在这里,我添加了一个变量pad,它将包含下一次迭代中要添加的焊盘数量,例如:input=5

  • 迭代=1 i=5 pad=1结果=5(所以下一个数字,即:4,将乘以10^1(
  • 迭代=2 i=4 pad=2结果=45(所以下一个数字,即:3,将乘以10^2(
  • 迭代=3 i=3 pad=3结果=345
  • 迭代=4 i=2焊盘=4结果=2345
  • 迭代=5 i=1焊盘=5结果=12345

当输入=12 时

  • 迭代=1 i=12焊盘=2结果=12
  • 迭代=2 i=11焊盘=4结果=1112
  • 迭代=3 i=10焊盘=6结果=101112
  • 迭代=4 i=9 pad=7结果=9101112
  • 迭代=5 i=8 pad=8结果=89101112
  • 迭代=6 i=7 pad=9结果=789101112
  • 迭代=7 i=6 pad=10结果=6789101112
  • 迭代=8 i=5 pad=11结果=56789101112
  • 迭代=9 i=4 pad=12结果=456789101112
  • 迭代=10 i=3焊盘=13结果=3456789101112
  • 迭代=11 i=2焊盘=14结果=23456789101112
  • 迭代=12 i=1焊盘=15结果=12346789101112

输出:

$ python3 /tmp/a.py 
5
12345
12345
assertion passed
$ python3 /tmp/a.py 
12
123456789101112
123456789101112
assertion passed

所以最后的代码是:

import math
inp = int(input())
result = 0
pad = 0
for i in range(inp, 0, -1):
result = result + i*10**pad
pad = pad + math.floor(math.log(i, 10)) + 1
print(result)

最新更新