Найдите закономерность и напишите программу, которая выводит аналогичную таблицу для любых чисел [latex]n > 0[/latex] (количество столбцов) и [latex]m > 0[/latex] (количество строк).
Замечание 1. В некоторых задачах появляется дополнительный параметр [latex]k < n[/latex].
Замечание 2. Многоточие означает продолжение последовательности
Совет. Если закономерность разгадать не получается, попробуйте воспользоваться Онлайн-энциклопедией целочисленных последовательностей.
1 2 3 4 5 6 7 8 9 |
123...k...321+123...k...3 23...k...321+123...k...32 3...k...321+123...k...321 ...k...321+123...k...321+ ..k...321+123...k...321+1 .k...321+123...k...321+12 k...321+123...k...321+123 ...321+123...k...321+123. |
Тесты
Входные данные | Выходные данные |
3 6 2 | 121+12 21+121 1+121+ |
5 5 4 | 12343 23432 34321 4321+ 321+1 |
4 19 9 | 12345678987654321+1 2345678987654321+12 345678987654321+123 45678987654321+1234 |
7 14 10 | 123456789109876 234567891098765 345678910987654 456789109876543 567891098765432 678910987654321 78910987654321+ |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> #include <cmath> using namespace std; int main() { int m, n, k; cin >> m >> n >> k; for (int i = 1; i <= m; i++) { int num = i % (2*k) <= k ? i % (2*k) : 2*k - i % (2*k);// определяем первый символ каждой строки if (num == 2*k) num = 0; bool up = i % (2*k) < k ? true : false;// определяем возрастает или убывает последовательность for (int j = 1; j <= n; j ++) { if (num == 0) cout << "+"; else cout << num; if (num == k) up = false; else if (num == 0) up = true; num = up ? num + 1 : num - 1; } cout << endl; } return 0; } |
Для запроса на выполнение нажать здесь.
Решение
Дано [latex]m[/latex] строк, в каждой из которых определены последовательности, каждая из которых состоит из чисел, возрастающих от 1 до [latex]k[/latex], затем спадающих до 1 и знак «+». Закономерность данной задачи состоит в последовательном сдвиге вправо каждой последующей строки и её выведении с элемента стоящего на первом месте.
Последовательность знаков каждой строки повторяется через каждые [latex]2k[/latex] знаков. Именно поэтому на [latex]2k[/latex]-ом месте будет стоять «+» (так как отсчёт начинается с 1, а не с 0).
Определяем первый знак каждой строки сравнением номера строки [latex]i[/latex] с [latex]k[/latex]: если он меньше или равен [latex]k[/latex], то он и будет первым знаком данной строки, в противном случае — первым знаком будет [latex](2k — i)[/latex].
Затем выводим цифры каждой строки:
- если цифра, с которой ведётся отсчёт данной строки, меньше [latex]k[/latex], то увеличиваем каждую последующую цифру (за «+» следует 1 и далее аналогично этому условию);
- если цифра равна [latex]k[/latex], то уменьшаем последующие цифры.