我试图在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(数字),sqrt(数字).
如果没有,则该对将是ceil(sqrt(number)),number / ceil(sqrt(number))
鉴于ceil(sqrt(number))是一个数字因子
或sqrt(数字)的直接因子邻居:
例如,考虑’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.这里ceil(sqrt(102))是11. 11的直接因素邻居是17或6.现在这是我们实际找到的.
我们如何找到直接因素邻居?
这是我的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)