2

我正在写一本通过 Python 教授计算机编程原理的书。其中一个手指练习要求我:编写一个程序,要求用户输入一个整数并打印两个整数,root 和 pwr,使得 0 < pwr < 6 并且 root^pwr 等于用户输入的整数。如果不存在这样的整数对,它应该打印一条消息。我写了一个程序来完成这个要求。我只有一个关于用列表的数字测试方程的问题。这是我的代码:

x = int(raw_input('Enter an integer: '))
root = 0
pwr = [1,2,3,4,5]
listnum = 0

for root in range(0, x + 1):  
    while pow(root, pwr[listnum]) < x:
        root += 1
        if pow(root, pwr[listnum]) == x:
                print str(root) + '^' + str(pwr[listnum]) + ' = ' + str(x)
                break
        listnum += 1
        if pow(root, pwr[listnum]) == x:
                print str(root) + '^' + str(pwr[listnum]) + ' = ' + str(x)
                break
        listnum += 1
        if pow(root, pwr[listnum]) == x:
                print str(root) + '^' + str(pwr[listnum]) + ' = ' + str(x)
                break
        listnum += 1
        if pow(root, pwr[listnum]) == x:
                print str(root) + '^' + str(pwr[listnum]) + ' = ' + str(x)
                break
        listnum += 1
        if pow(root, pwr[listnum]) == x:
                print str(root) + '^' + str(pwr[listnum]) + ' = ' + str(x)
                break
        listnum = 0
    if pow(root, pwr[listnum]) == x:
        break
    else:
        print 'No combinations within parameters exist'

我想知道如何测试if pow(root, pwr[listnum]) < x对于所有 5 个增量,而不必重复listnum += 1...if...break重复。如果问题不清楚,我可以尝试详细说明。我已经看到一个关于这个确切问题的问题,但他们都没有明确回答我的具体问题,所以我无意重新发布问题。如果要提出任何其他建议,他们将不胜感激。谢谢!

4

1 回答 1

3

这是做你所追求的一种方法:

def find(x):
    for root in range(x + 1):
        for pwr in range(1, 6):
            y = pow(root, pwr)
            if y > x:
                break
            if y == x:
                return root, pwr
    return None

x = int(raw_input('Enter an integer: '))
result = find(x)
if result is None:
    print 'No combinations within parameters exist'
else:
    root, pwr = result
    print root, "**", pwr, "=", x

不过,我不确定这就是你想要的。 ^在 Python 中是按位异或,而不是求幂。因此,问题陈述使用^.

另一个特点是它"No combinations ..."永远不会被打印出来,因为无论你输入什么xpow(x, 1) == x都会找到一个解决方案。

于 2013-10-27T02:29:27.927 回答