寻找用户输入整数的根/幂整数对的Python练习

1 投票
2 回答
86 浏览
提问于 2025-04-14 15:21

这是题目的原文:

练习:写一个程序,让用户输入一个整数,然后打印出两个整数,分别是rootpwr,要求满足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

这里有一些你代码的改进建议:

  1. result_state 的类型从 string 改成 boolean。因为比较布尔值比比较字符串要快。
  2. root 的范围从 range(-abs(num_value), abs(num_value)) 改成 range(-sqrt_num, sqrt_num + 1)。因为最小的 pwr 是 2,如果 root 大于 abs(num_value) 的平方根,那么 test_value 就不可能等于 num_value
  3. if-statement 中添加 break,如果有一对 rootpwr,当 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.')

撰写回答