0

我有n元素作为输入和一个函数make_grid(n),它将计算包含元素的网格的尺寸。假设n = 12,那么函数必须计算宽度为 4 高度为 3 而不是 1 和 12 左右。同样,n = 24应该返回 6 和 4。

我试图用它ceil(sqrt(n))来获得一维,但根本不是一般情况,并且玩 case (n even, sqrt(n) == ceil(sqrt(n))) 并没有奏效。

编辑: 为具有 n 个元素及其比例的给定范围的表格找到最佳列和行大小 我已经看到了这个问题,但是编码让我想到了 n = 24 维 5 和 5。有帮助吗?

4

3 回答 3

1

您正在寻找均分的数字n,因此您需要计算 的因数n,并取最接近 的两个sqrt(n)。一个将是小于或等于sqrt(n)(称之为f)的最大因子,另一个将是n/f

但是,对于许多数字,例如 74 或任何素数,您会得到看起来很奇怪的网格。

于 2013-06-03T23:41:24.657 回答
1

您正在寻找整数分解算法。

在这里检查:有效地找到一个数字的所有除数

在这里:http ://en.wikipedia.org/wiki/Integer_factorization#Factoring_algorithms

然后只需选择最符合您目标的一对因素。

于 2013-06-03T23:42:12.573 回答
0

方法如下:

取整数n作为函数的输入。目标是获得“最平方”的表。正如@John 建议的那样,我们必须计算sqrt(n)才能了解尺寸。另一方面,我们必须计算 的所有除数,n以便选择最接近 的除数sqrt(n)

我们如何选择最接近的低值?我们可以使用这个技巧(Python):找到最接近未完全排序的列表中的值的项目的索引,并获取除数列表中最接近的值的索引,比方说hIndexn然后可以通过除以divisors[hIndex]或使用新索引来计算另一个维度wIndex = hIndex + 1并得到divisors[wIndex]

Python 代码是这样的(请注意,我使用了惰性求值来查找除数):

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]
于 2013-06-04T03:43:38.457 回答