MLoops 23

Условие

Найдите закономерность и напишите программу, которая выводит аналогичную таблицу для любых чисел [latex]n > 0[/latex] (количество столбцов) и [latex]m > 0[/latex] (количество строк):

Тесты

[latex]n \times {m}[/latex] Выходные данные
[latex]2 \times {2}[/latex]  0,
_1
[latex]2 \times {10}[/latex] 0,
_1
,
8,
_2
7,
_6
4,
_1
25
[latex]5 \times {5}[/latex] 0, 1,
_8, 2
7, 64
, 125
, 216
[latex]20 \times {1}[/latex]  0, 1, 8, 27, 64, 125
[latex]22 \times {10}[/latex] 0, 1, 8, 27, 64, 125,
216, 343, 512, 729, 10
00, 1331, 1728, 2197,
2744, 3375, 4096, 4913
, 5832, 6859, 8000, 92
61, 10648, 12167, 1382
4, 15625, 17576, 19683
, 21952, 24389, 27000,
_29791, 32768, 35937,
39304, 42875, 46656, 5

(Нижние подчеркивания в таблице добавил намеренно, там, где строка начинается с пробела, так как они автоматически убирались.)

Решение

Нетрудно заметить, что данная последовательность содержит кубы натуральных чисел, разделенные запятой с пробелом (единственное отличие, первое число — ноль). Очевидно, понадобится использовать 2 цикла, внешний (для строк) и внутренний (для столбцов). Для простоты я попробовал составить алгоритм так, чтобы:

а) во внешнем цикле не было ничего, кроме перехода на новую строку;

б) за один шаг внутреннего цикла печатался ровно 1 символ.

Проанализируем ключевые моменты. Во первых, числа надо будет выводить по одной цифре за раз. Так как мы не знаем длину числа, можно воспользоваться функцией [latex]log10[/latex], но намного проще выводить число в обратном порядке (используя деление по модулю 10), поэтому при вычислении очередного куба будем сохранять его во временную переменную, а в печатаемую переменную [latex]cube[/latex] будем сохранять это число,  записанное в обратном порядке, и выводить его на экран также в обратном порядке (таким образом, получая исходный порядок).

Как только число стало ноль, нужно вывести запятую, затем пробел. Запятую будем выводить сразу вместо очередной цифры числа, для пробела заведем логическую переменную [latex]addSpacebar[/latex], которую будем проверять вначале каждого шага внутреннего цикла.

Единственный недочет — числа вроде 1000, так как при инверсии получим 0001, то есть число 1. Я решил эту проблему, заведя переменную [latex]zeros[/latex], хранящую кол-во таких нулей. Начальное число ноль тоже учтено в коде (см. комментарии).

Код

Ссылки

Рабочий код на Ideaone.

Тут можно посмотреть саму последовательность.

Related Images: