2

这是来自 Python 计算和编程简介中的手指练习 3.1。

编写一个程序,要求用户输入一个整数并打印两个整数rootpwr,使得0 < pwr < 6root**pwr等于输入的整数。如果不存在这样的整数对,它应该打印一条消息。

我非常接近,部分归功于 Stack Overflow 中的一些建议。但是没有人能做到这一点,部分原因是练习的重点是使用嵌套的 While 循环,而不是 For 循环或其他比这更复杂的循环。这是一个练习,是详尽的枚举。

我真的很亲近。这是我到目前为止所拥有的:

num = int(raw_input('Enter a positive integer: '))
power = 0
root = 0
while power < 6:
    if root ** power == num:
        break
    power += 1
    root= 0
    while root ** power < num:    
        root += 1

if root**power == num:
    print('Root = ' + str(root) + ' and power = ' + str(power))
else:
    print('No pair of integers exist such that one has an exponent that is between 1 and 6')

这里只有两个问题:我必须运行检查以查看 root 和 power 是否等于用户输入,这感觉没有必要。想知道如何使那个更清洁。

此外,当用户输入1输入时,程序会输出Root 0 and Power 0超出练习参数的内容。

4

6 回答 6

1

想知道如何使那个更清洁。

简单的。你可以把它折叠成一条线,转动

while power < 6:
    if root ** power == num:
        break

进入

while (power < 6) and (root ** power != num):

(括号是不必要的,但我发现它有助于可读性。)

于 2013-10-27T22:08:21.137 回答
1

你需要反转你的循环。您需要增加外循环中的根,然后遍历内循环中的幂。否则,您将始终匹配“power == 1”,因为 root 将增加到目标数字,仅此而已。

你有它的方式,如果你有 num = 42,power 将设置为 1,然后 root 将被迭代到 42。如果你在内部循环中增加了 power,那么你将拥有:

root == 1, power == 1, root**power == 1
root == 1, power == 2, root**power == 1
root == 1, power == 3, root**power == 1
root == 1, power == 4, root**power == 1
root == 1, power == 5, root**power == 1
root == 2, power == 1, root**power == 2
root == 2, power == 2, root**power == 4
root == 2, power == 3, root**power == 16
root == 2, power == 4, root**power == 64
root == 3, power == 1, root**power == 3
root == 3, power == 2, root**power == 9
... and so forth ...

这不是您要寻找的行为吗?

于 2013-10-27T22:11:39.037 回答
1

如果有人仍然感兴趣,这是我的解决方案。(每次迭代都添加了打印)

x = int(raw_input('Enter an  integer: '))


pwr = 1
root = 0
while root**pwr < abs(x)+1:  
    #print  "Root ->" , root 
    #print "x - >", x
    #print "Current root**pwr", root**pwr
    while pwr < 6:
        if root**pwr == abs(x):
              print "Root and Power: " , root, pwr
        #print  " pwr, root**pwr->", pwr, root**pwr
        pwr = pwr + 1


    pwr = 1
    root = root+1
于 2016-05-01T19:36:50.607 回答
0

目前您已设置:

power = 0
root = 0

如果用户输入 1 那么0**0 = 1你就跳出你的 while 循环并且第一个打印条件通过。有几种方法可以解决这个问题,一种方法是在 if 中添加一个额外的条件,在打印之前检查 num 的值是否为 1。

if (root**power == num) and (not num == 1):
    print('Root = ' + str(root) + ' and power = ' + str(power))

解决此问题的另一种方法是将幂的初始值更新为 1。在问题规范0<power<6中,幂的下限为 1,上限为 5。

power = 1
root = 0

为了使代码更简洁,您可以在 while 循环中合并 if 语句作为 while 循环的检查条件。你可以这样做的主要原因是因为你break无论如何都来自这个 if 语句。

while (power < 6)and not (root**power == num):
    power+=1
    while root ** power < num:
        root+=1
于 2013-10-27T22:07:49.027 回答
0
x = int(raw_input('Enter an integer:'))
num = 2
for pwr in range(2,7):
  while num ** pwr < x:
        num += 1
        if num ** pwr == x:
          False

  if num ** pwr == x:
      break
  num = 2
if num ** pwr != x:
    print 'no root'
else:
    print num,pwr
于 2015-06-29T11:56:36.747 回答
0

正如sdanzig 所说,您应该增加外循环的根,以及内循环的功率。但还有更多工作要做。这是工作代码:

integer = int(input('Type an integer: '))
power = 2
root = 1

while root ** power < integer:
    root = root + 1
    while root ** power < integer and power < 5:
        power = power + 1
    if root ** power != integer:
        power = 2

if root ** power == integer:
    print(str(root) + ' ** ' + str(power) + ' = ' + str(root ** power))
else:
    print('Unable to locate a combination of root and power that results in the chosen integer')

这里发生了什么?

首先,两个循环都在 condition 下工作root ** power < integer。这是必不可少的。

外循环正在执行 3 个不同的任务:

  1. 递增root
  2. 开始内循环。
  3. 有条件地重置power

内循环只做一件事:

  1. 增量power

    只要power不超过5

模拟

让我们考虑一下integer = 27

2 ** 2 = 4
2 ** 3 = 8
2 ** 4 = 16
2 ** 5 = 32

32导致内部循环中断,但这不是我们正在寻找的数字,因此power在外部循环重新启动之前重置。

if root ** power != integer:
    power = 2
3 ** 2 = 9
3 ** 3 = 27

就是这样。答对了。

一个警告

如您所见,我们分配2为尽可能低的power. 这可以防止奇怪的结果,例如27 ** 1 = 27. 不幸的是,这违反了书中描述的要求。如果您知道对此的替代解决方案,请告诉我们。

于 2020-09-04T01:22:35.727 回答