Условие
Найдите закономерность и напишите программу, которая выводит аналогичную таблицу для любых чисел [latex]n > 0[/latex] (количество столбцов) и [latex]m > 0[/latex] (количество строк):
1 2 3 4 5 6 7 8 |
0, 1, 8, 27, 64, 125, 216 , 343, 512, 729, 1000, 13 31, 1728, 2197, 2744, 337 5, 4096, 4913, 5832, 6859 , 8000, 9261, 10648, 1216 7, 13824, 15625, 17576, 1 9683, 21952, 24389, 27000 , 29791, 32768, 35937, 39 |
Тесты
[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], хранящую кол-во таких нулей. Начальное число ноль тоже учтено в коде (см. комментарии).
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include <iostream> using namespace std; int main() { int n, m; cin >> n >> m; long num = 0, cube = 0; bool addSpacebar = false; int zeros = 0; for (int i = 0; i < m; i ++) { for (int j = 0; j < n; j ++) { if (addSpacebar) //если необходим пробел { cout << " "; addSpacebar = false; } else if (cube > 0 || num + j == 0) //печатаем текущую цифру пока число больше нуля, num + j == 0 позволяют напечатать число 0 { cout << cube % 10; cube /= 10; } else if (zeros > 0) //если закончили печатать число, но у него остались "потерянные" нули, выводим их пока не закончатся { cout << 0; zeros --; } else //иначе { cout << ","; //печатаем запятую addSpacebar = true; //запоминаем, что нужен пробел num ++; long L = num * num * num; //получаем куб следующего числа while (L > 0) //записываем его в обратного порядке { cube *= 10; cube += L % 10; if (cube == 0) zeros ++; //если число L заканчивалось на ноль, запоминаем его (ноль) L /= 10; } } } cout << endl; } return 0; } |
Ссылки
Рабочий код на Ideaone.
Тут можно посмотреть саму последовательность.
— Вы пишите «Нижние подчеркивания в таблице добавил намеренно, там, где строка начинается с пробела, так как они автоматически убирались.». Для результатов нам нужно использовать monospaced шрифт. Простейший способ это сделать — вставлять эти таблички как код программы. Только выберите подходящие настройки.
— Вы пишите «Не трудно заметить» . Я огорчён — надеялся заметить будет трудно. Знал бы убрал запятые и пробелы. Ладно, только напишите «нетрудно» слитно.
Молодец. Зачтено.