Учитывая число, программа для построения двумерной сетки

Целью программы является создание двумерной сетки значений. Мы получаем общее количество элементов, присутствующих в сетке, как ввод от пользователя (скажем, 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.

Можете ли вы предложить лучший способ построения сетки?

1 ответ

Первичная факторизация - например: дано 6 , находя 3*2 - это одна из самых больших проблем современных вычислений. Самый простой и, вероятно, самый надежный способ сделать это - просто выполнить итерацию. (т. е. делится на 1? делится на 2? делится на 3?...)

Хорошая новость в том, что вы итерируете в любом случае! Поэтому вместо того, чтобы пытаться решить эту проблему, угадывая факторы (rowlen а также collen) начать итерацию с выводом и проверять каждое число по пути, чтобы увидеть, является ли это фактором! Как только вы найдете один, только тогда вы должны решить, сколько строк и столбцов у вас будет.

Что-то вроде (псевдокод):

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);
}
Другие вопросы по тегам