如何解决类型错误:不支持 ** 或 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 中表达 set 的方式
第二:您要求打印数字字符串的方法,但没有字符串操作(因此所有连接都应在两个整数之间另外完成)。这里我假设接受的输入只能是正数
例如:
- 输入 5,输出=12345
- 输入 12,输出=123456789101112
在学习解决此类“挑战”问题时,最好进行测试驱动:编写一个可以正常工作的简单程序,然后与生成的预期结果进行比较/断言
这是生成输出的正确但不可接受的方式(使用字符串操作):
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,-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
,它将包含在下一次迭代中添加的 pad 数量,例如:input=5
- iteration=1 i=5 pad=1 result=5(所以下一个数字,即:4,将乘以 10^1)
- iteration=2 i=4 pad=2 result=45(所以下一个数字,即:3,将乘以 10^2)
- 迭代=3 i=3 pad=3 结果=345
- iteration=4 i=2 pad=4 result=2345
- iteration=5 i=1 pad=5 result=12345
当输入=12
- 迭代=1 i=12 pad=2 结果=12
- iteration=2 i=11 pad=4 result=1112
- 迭代=3 i=10 pad=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 pad=13 结果=3456789101112
- 迭代=11 i=2 pad=14 结果=23456789101112
- 迭代=12 i=1 pad=15 结果=123456789101112
输出:
$ 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,10)) + 1
print(result)
,
n = int(input())
s,m = 0,1
for i in range(n,-1):
s += i*m
m *= 10
print(s)
,
chepner's comment 和 Kristian's answer 说明您收到该错误的原因。
我想知道,你甚至需要做任何算术吗?这提供了一个字符串作为 print
的参数,但实际上并没有使用任何字符串方法(例如 join
)。有人可能会争辩说这是遵循“不使用任何字符串方法......”的字母(如果不是精神的话)
n = int(input("Enter a number: "))
# Generate a list of the numbers from 1 through n.
numbers = list(range(1,n + 1))
# Print out all the numbers,without spaces between them.
print(*numbers,sep='')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。