1

该程序的目标是创建一个二维值网格。作为用户的输入,我们得到网格中存在的元素总数(例如,n)。我们需要构建一个包含 n 个值的二维网格(这些值从 0 开始是连续的,即 0,1,2,3,4,5,6..n)

For n=9,

0 1 2
3 4 5
6 7 8

For n=6,

Either,
0 1 2
3 4 5
or
0 1
2 3
4 5

以下是我到目前为止所管理的:

int rowlen = (sqrt(n))
int collen = (n/rowlen)
int no = 0;

for (int i = 0; i < rowlen-1) {
    for (int j = 0; j < collen-1) {

        System.out.print(no+"\t")
        no++;

    }

    System.out.println()
}

上面的代码适用于完全平方数,也适用于“n”为偶数的少数其他情况。但是如果'n'是奇数并且对于'n'的少数其他偶数值,例如n = 10,它会失败。

您能否建议一种更好的构建网格的方法?

4

1 回答 1

1

素数分解——例如:给定6,求3*2——是现代计算的巨大挑战之一。最简单也可能是最可靠的方法就是迭代。(即它可以被 1 整除吗?它可以被 2 整除吗?它可以被 3 整除吗?...)

好消息是无论如何你都在迭代!因此,不要尝试通过猜测因子 (rowlencollen) 来解决该问题,而是开始迭代输出,并检查沿途的每个数字,看看它是否是一个因子!一旦你找到一个,只有这样你才应该费心决定你将拥有多少行和列。

类似(伪代码):

var n = 10;

var cols = 0;

for(var i=0; i<n; i++) {
    if(i>1 && ((cols === 0 && n%i === 0) || (cols>0 && i%cols===0))) {
        if(cols===0) { // we've found our first prime factor;
                       // this value will be used as the number of columns
            cols = i;
        }
        print("\n");
    }
    print(i);
}
于 2012-09-30T04:30:16.163 回答