将2维数组分成子数组

4
我需要将一个二维数组(其大小由用户指定)根据用户输入的数量分割成子数组。我编写的代码对大多数情况都有效,但有些情况需要帮忙。
我通过获取输入数字的平方根来实现这一点。例如: 如果用户插入[10, 10, 9],则表示这是一个大小为10 * 10,有9个子数组的数组。获取9的平方根很好用,因为它得到了3。 如果用户插入[8, 6, 6],则获取6的平方根并将其向上取整到最长边(即3),并将其向下取整到最短边(即2)。因此,3 * 2 = 6。这也很好用。
然后有一个像8这样的情况。8的平方根是3和2。因此,该数组被分成6个子数组。是否有另一种方法来找到像8、14这样的数字的更好的分区方法?或者是否有一种找到这些数字的最优分配的方法(例如2 * 4 = 8,2 * 7 = 14)?

你能解释一下如何分割子数组吗?例如,[10,10,9]会得到9个3x3的子数组吗? - Sach
是的,确切地说。9会给出一个33的数组。在第二个例子中[8, 6, 6]会给出一个32的数组。 - user1798707
它将简单地要求用户提供更好的输入。我认为目前这不是我们的问题。 - user1798707
这些子数组可以重叠吗? - hasan
不,这不是摄像头问题。而且你不能理解并不是我的问题。它们不能重叠。很简单,只需将数组分成子数组即可。没有特殊要求。 - user1798707
显示剩余3条评论
2个回答

1
您可以用稍微不同的方法计算它们:
int x = Math.round(Math.sqrt(n));
int y = Math.round(1. * n / x);

因此,您将收到:

n = 8  => x = 3, y = 3
n = 14 => x = 4, y = 4

谢谢你的答案。我已经测试过Math.round了。我会用你的方法来测试y。为什么在n/x前面加了1.呢? - user1798707
将此表达式转换为 double 类型,与 ((double) n) / x 相同。 - ursa

0
你需要做的是找到最接近平方根的两个因数。可以尝试使用以下代码:
long n = 14;

long y = 0;
long x = Math.round(Math.sqrt(n));
while(true){
    if (n % x == 0) {
        y = n/x;
        break;
    }
    else {
        x--;
    }
}

您可能还想加入一些错误检查来处理输入错误,例如 n<1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接