我有n
个元素作为输入,函数make_grid(n)
将计算包含元素的网格的尺寸。假设n = 12
,那么函数必须计算宽度为4,高度为3而不是1和12左右。同样,n = 24
应返回6和4。
我尝试使用ceil(sqrt(n))
来获取一个维度,但根本不是一般情况,并且使用案例(n even,sqrt(n) == ceil(sqrt(n))
)无效。
编辑: Finding the optimum column and row size for a table with n elements and a given range for its proportion 我已经看到了这个问题,但编码引发了我n = 24维5和5。 有什么帮助吗?
答案 0 :(得分:1)
您正在寻找均匀划分n
的数字,因此您需要计算n
的因子,并选择最接近sqrt(n)
的两个因子。一个将是小于或等于sqrt(n)
的最大因子(称为f
),另一个将是n/f
。
然而,对于许多数字,你会看到奇怪的网格,比如74,或任何素数。
答案 1 :(得分:1)
您正在寻找整数分解算法。
点击此处:Efficiently finding all divisors of a number
在这里:http://en.wikipedia.org/wiki/Integer_factorization#Factoring_algorithms
然后选择一对最符合您目标的因素。
答案 2 :(得分:0)
方法如下:
取整数n
作为函数的输入。目标是获得“最平常”的表格。正如@John建议的那样,我们必须计算sqrt(n)
才能了解维度。另一方面,我们必须计算n
的所有除数,以便选择最接近sqrt(n)
的除数。
我们如何选择最接近的低值?我们可以使用这个技巧(Python):finding index of an item closest to the value in a list that's not entirely sorted并获得除数列表中最近值的索引,假设为hIndex
。
然后可以计算另一个维度,将n
除以divisors[hIndex]
或使用新索引wIndex = hIndex + 1
,然后获取divisors[wIndex]
。
Python代码是这样的(注意我使用al lazy evaluation来查找除数):
import numbers
from math import sqrt
def get_dimensions(n):
tempSqrt = sqrt(n)
divisors = []
currentDiv = 1
for currentDiv in range(n):
if n % float(currentDiv + 1) == 0:
divisors.append(currentDiv+1)
#print divisors this is to ensure that we're choosing well
hIndex = min(range(len(divisors)), key=lambda i: abs(divisors[i]-sqrt(n)))
wIndex = hIndex + 1
return divisors[hIndex], divisors[wIndex]