寻找用户输入整数的根/幂整数对的Python练习
这是题目的原文:
练习:写一个程序,让用户输入一个整数
,然后打印出两个整数
,分别是root
和pwr
,要求满足1 < pwr < 6
,并且root**pwr
等于用户输入的整数。如果找不到这样的整数对,程序应该打印出相应的提示信息。
这是我写的代码:
num_value = int(input("Enter a number value:"))
result_state = "unknown"
for root in range (-abs(num_value),abs(num_value)):
for pwr in range(2,6):
test_value = root**pwr
if test_value == num_value:
print(f'{num_value} is equivalent to {root} to the power of {pwr}')
result_state = "Printed"
if result_state != "Printed":
print('I was not able to find a root/power integer pair for this number.')
我写的代码可以正常工作,但我觉得可能还有更有效的方法来实现同样的结果。我也觉得我可能在根的范围上加了一些绝对值的函数,这样做有点多余。我正在自学Python,使用开放课程资源,但我想确保自己不会在理解上留下盲点。所以提前感谢你的帮助!
2 个回答
0
使用赫伦法/牛顿法来计算n的p次根:
def root_and_pwr(n):
if n >= 0:
sign = +1
P = range(2, 6)
else:
n = -n
sign = -1
P = range(3, 6, 2)
for p in P:
r = n
q = p - 1
while r**p > n:
r = (q*r + n//r**q) // p
if r**p == n:
return sign*r, p
return None, None
使用示例:
for n in range(-100, 101):
root, pwr = root_and_pwr(n)
if root is not None:
print(f'{n} = {root}^{pwr}')
print(root_and_pwr(3141592653589793238462643383279 ** 5))
这个程序的输出结果是(在线尝试这个!):
-64 = -4^3
-32 = -2^5
-27 = -3^3
-8 = -2^3
-1 = -1^3
0 = 0^2
1 = 1^2
4 = 2^2
8 = 2^3
9 = 3^2
16 = 4^2
25 = 5^2
27 = 3^3
32 = 2^5
36 = 6^2
49 = 7^2
64 = 8^2
81 = 9^2
100 = 10^2
(3141592653589793238462643383279, 5)
对于你指定的输入/输出:
num_value = int(input("Enter a number value:"))
root, pwr = root_and_pwr(num_value)
if root is not None:
print(f'{num_value} is equivalent to {root} to the power of {pwr}')
else:
print('I was not able to find a root/power integer pair for this number.')
把输入和输出跟计算分开是个好主意。把纯计算放在一个函数里,这样代码会更整洁,也更容易测试。例如,你可以把你的解决方案写在一个类似的函数里,把其他答案写在第三个函数里,然后对许多num_value
值进行循环,比较这三个函数的结果。
0
这里有一些你代码的改进建议:
- 把
result_state
的类型从string
改成boolean
。因为比较布尔值比比较字符串要快。 - 把
root
的范围从range(-abs(num_value), abs(num_value))
改成range(-sqrt_num, sqrt_num + 1)
。因为最小的pwr
是 2,如果root
大于abs(num_value)
的平方根,那么test_value
就不可能等于num_value
。 - 在
if-statement
中添加break
,如果有一对root
和pwr
,当root
增加时,test_value
就不可能再等于num_value
。
这是更新后的代码:
num_value = int(input("Enter a number value: "))
result_state = False
sqrt_num = int(abs(num_value) ** 0.5)
for root in range(-sqrt_num, sqrt_num + 1):
for pwr in range(2, 6):
test_value = root ** pwr
if test_value == num_value:
print(f'{num_value} is equivalent to {root} to the power of {pwr}')
result_state = True
break # Exit inner loop if pair found
if result_state != True:
print('I was not able to find a root/power integer pair for this number.')