Как отобразить квадратную таблицу для неизвестного количества чисел - PullRequest
2 голосов
/ 04 ноября 2019

Я пишу программу, которая вычисляет последовательность простых чисел и затем отображает их в таблице.

Программы просят пользователя ввести 2 целых числа: первое - это число, с которым последовательностьначинается, а второй - количество простых чисел, которые будут найдены. До этого, программа работает отлично. Проблема в том, что простые числа должны отображаться в «квадратной» таблице, а это означает, что, если возможно, таблица должна быть идеально квадратной. Если это невозможно, то количество строк и столбцов не должно отличаться более чем на 1.

Вот пример того, что я пробовал:

   int columns = 0;
   int rows = 0;
   int element = 0;

   rows = (int) Math.sqrt(numberOfPrimes);
   columns = (rows * rows) < numberOfPrimes ? rows + 1 : rows;

   if(numberOfPrimes%3 - 1.0 < 0.001)
   {
       columns = rows + 1;
       rows = rows + 1;
   }

   if (numberOfPrimes > 100)
   {
       columns = 10;
       if (rows * rows < numberOfPrimes)
       {
           rows = numberOfPrimes / 10;
       }

   }
   System.out.println(numberOfPrimes + " = [" + rows + "," + columns + "]");


   for (int r = 0; r < rows; r++) 
   {
      for (int c = 0; c < columns; c++)
      {
          System.out.printf("%6s", primesArray[element] + "\t");
          if (element == primesArray.length - 1)
          {
              break;
          }
          element++;
      }
      System.out.println();
   }

Таблицаотображается правильно для некоторых входов, но не для других. Я знаю, что этот код неверен, но я понятия не имею, как написать правильный код для этого. Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: я обновил код до того, что у меня есть сейчас. Таблица не работает должным образом для нечетных чисел, таких как 33. Она печатает только 30 чисел, а не оставшиеся 3. Мне нужна дополнительная строка, которая печатает эти оставшиеся числа, даже если эта строка является неполной. Я пытался решить эту проблему, но я создал массив из-за ошибки. Кроме того, я добавил оператор if, потому что если число простых чисел превышает 100, тогда таблица должна иметь только 10 столбцов и не будет квадратной.

РЕДАКТИРОВАТЬ 2: мне удалось решить проблему, и яобновил код, чтобы показать решение. Однако мне пришлось использовать перерыв, и мой профессор не позволяет нам использовать перерывы. Есть ли другой способ выхода из цикла, как только мы достигнем последнего элемента в массиве?

1 Ответ

0 голосов
/ 04 ноября 2019

Это один из способов

    int primeNumbersToBeFound = 33;

    int rows = (int) Math.ceil(Math.sqrt(primeNumbersToBeFound));
    int cols = rows;
    if (rows * (rows - 1) >= primeNumbersToBeFound) {
        cols--;
    }

    System.out.println(primeNumbersToBeFound + " = [" + rows + "," + cols + "]");

Затем вы можете циклически перебирать строки и столбцы, печатая простые числа.

    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < cols && element < primesArray.length; c++, element++) {
            System.out.print(primesArray[element]);
        }
        System.out.println();
    }
...