【问题标题】:How would I go about finding multiple integers at the same time, then executing a print command based off those integers我将如何同时查找多个整数,然后根据这些整数执行打印命令
【发布时间】:2017-05-18 10:31:44
【问题描述】:

我正在尝试创建一个程序,该程序将找到平方根、立方根、四分之一根和五倍根小于 2^60 的每个数字。每次我运行命令时,我只会得到每个平方数,这就是我将变量 N​​um1 编程为的。

代码:

Num = 1
Num1 = 1

while Num1 < 1152921504606846976:

    Num += 2
    Num1 += Num

    Num2 = Num1 ** 0.5
    Num3 = Num1 ** 0.33333333333333333333
    Num4 = Num1 ** 0.25
    Num5 = Num1 ** 0.2

    if Num1 > Num:
        float(Num2).is_integer()and float(Num3).is_integer()and float(Num4).is_integer() and float(Num5).is_integer()
        print Num1
    else:
        null

抱歉代码不好,我对这个真的很陌生。 Num2 - Num5 是数字 Num1 的答案,如果它们都是整数,我的目标是让打印命令给出原始数字 Num1

【问题讨论】:

  • 这个程序一定会失败。除了效率很低之外,试试1000**0.33333333333333333333,你不会得到10。你不应该在这种类型的测试中使用浮点数......
  • 你的意思是每一个 integer 数的平方根......?
  • 你没有要求程序打印 Num1

标签: python integer


【解决方案1】:

正如 Julien 指出的那样,由于精度问题,在这个问题中使用浮点数是有问题的。此外,您正在迭代直到 2 ^ 60,这可能会很慢。

简单但缓慢的方法

一种简单的方法是生成所有具有平方根的整数,然后生成所有具有立方根的整数,依此类推。之后,对我们目前生成的所有数字进行交集。

这个过程很容易完成,我们需要从 1 迭代到 n^(1/k) 以生成具有第 k 个根的数字,如果 i^k 小于或等于我们的最大数,那么我们找到了第 k 个根。代码:

def kth_roots(n, k):
  i = 1
  ans = []
  while i ** k <= n:
    ans.append(i ** k)
    i += 1

  return ans

n = 2 ** 60
two = kth_roots(n, 2)
three = kth_roots(n, 3)
four = kth_roots(n, 4)
five = kth_roots(n, 5)

answer = set(two) & set(three) & set(four) & set(five)
print(answer)

基于可分性的方法

我将提出一个答案,假设您将最大数量表示为 x ^ y 形式的幂。

请注意,如果一个数可以表示为 b ^ e,则该数将有一个整数平方根,这样 e 可以被 2 整除,则它有一个如果 e 可以被三整除,则整数立方根,依此类推。因此,更好的方法是检查哪些指数将满足您的条件(可被 2、3、4 和 5 整除)。最后我们必须确定b的值,我们可以暴力破解,只要它大于x ^ y就停止。

通过这种方式,我们不必处理在这里可能会令人头疼的浮点数。一些代码:

max_exp = 60
max_base = 2
maxm = max_base ** max_exp

ans = 0
e = 1
print(1) # Trivial case
while True:
  if e % 2 == 0 and e % 3 == 0 and e % 4 == 0 and e % 5 == 0:
    b = 2
    flag = False
    while b ** e <= maxm:
      flag = True
      print(b ** e)
      b += 1

    if flag is False:
      break

  e += 1

编辑:正如 Hugh Bothwel 所提到的,可以减少对幂的整除性检查以计算 [2,3,4,5] 的 LCM,即 60,因此任何数字 a^60 具有上述整数根。剩下的就是暴力破解 a 的值。代码:

from fractions import gcd

def _lcm(x, y):
  return (x * y) // gcd(x, y)


maxm = 2 ** 60
lcm = reduce(_lcm, [2, 3, 4, 5], 1)

a = 1
while a ** lcm <= maxm:
  print(a ** lcm)
  a += 1

【讨论】:

  • ... 和 LCM(2,3,4,5) 是 60 (2^2 * 3 * 5),所以你正在寻找每个数字 n E {1,2}
猜你喜欢
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 2017-03-24
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多