【发布时间】:2017-08-24 07:20:43
【问题描述】:
我正在尝试找到 O(1) 中总和最小的数字的因子对。
解释如下:
If number is 100. Then all the possible pairs are :
1 X 100
2 X 50
4 X 25
5 X 20
10 X 10
20 X 5
25 X 4
50 X 2
100 X 1
这里总和最小的一对是 10,10,这显然是中间的一对
Similarly if number is 12 then pairs are as follows
1 X 12
2 X 6
3 X 4
4 X 3
6 X 2
12 X 1
这里需要的对是 3,4 或 4,3。
If a number has 'p' pairs then the required one is always ceil(p/2).
如果给定的数字是一个完美的正方形,那么任务就很简单了。这对只是sqrt(number),sqrt(number).
如果不是,那么这对将是ceil(sqrt(number)),number/ceil(sqrt(number))
<b>given that ceil(sqrt(number)) is a factor of number</b>
或immediate factor neighbour of sqrt(number):
例如考虑“6”。 6 不是一个完美的正方形。
sqrt(6) 的 ceil 是 3,3 是 6 的因数。所以需要的对是 3,6/3=2
Now consider 102. All pairs are :
1 * 102.0
2 * 51.0
3 * 34.0
6 * 17.0
17 * 6.0
34 * 3.0
51 * 2.0
102 * 1
这里需要的对是 17,6 或 6,17。 Here ceil(sqrt(102)) is 11。 11 的直接因子邻居是 17 或 6。<b>Now this is what we actually find.</b>
我们如何找到直接因子邻居?
这是我的 O(n) 实现:
import math
l = []
n = int(input())
for i in range(1, n + 1):
if n % i is 0:
l.append(i)
middle = l[math.ceil(len(l) / 2)]
print("Required pair is ", middle, ",", n / middle)
【问题讨论】:
-
java标签有什么用? -
对于任何整数?素数呢?
-
它可以在 O(sqrt(n)) 中轻松解决,并且在 for 循环中获得最大除数
-
究竟是什么让您认为 O(1) 可能?
-
重要提示:寻找最接近 sqrt(n) 的除数实际上并没有帮助,因为我们不知道在 O(1) 中这样做。如果可以的话,我们将能够轻松地进行整数分解。更多信息在这里:math.stackexchange.com/questions/2376860/closest-divisor
标签: python algorithm math data-structures mathematical-optimization