Задача. Найдите закономерность и напишите программу, которая выводит аналогичную таблицу для любых чисел [latex]m>0[/latex] (количество столбцов) и [latex]n>0[/latex] (количество строк). При чем [latex]k<m[/latex]. Многоточие означает продолжение последовательности.
1 2 3 4 5 6 |
112233...kk112233...kk1122 k112233...kk112233...kk112 kk112233...kk112233...kk11 .kk112233...kk112233...kk1 ..kk112233...kk112233...kk ...kk112233...kk112233...k |
Тесты
[latex] m[/latex] | [latex] n[/latex] | [latex] k[/latex] | Результат |
25 | 4 | 8 | 1122334455667788112233445 8112233445566778811223344 8811223344556677881122334 7881122334455667788112233 |
8 | 9 | 3 | 11223311 31122331 33112233 23311223 22331122 12233112 11223311 31122331 33112233 |
4 | 4 | 3 | 1122 3112 3311 2331 |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream> #include <cmath> using namespace std; int main() { int m, n,k; double l=1; int counter = 0; cin >> m >> n >>k; for (int i=1; i<=n; i++){ if(counter) l=k*2-(counter-1); //вычисляем первый элемент строки if(l<2) counter=0; //проверяем элемент на положительное значение for (int j=1; j<=m; j++){ if(l>k*2){ l=1; } cout << ceil(l/2) ; l++; } cout << endl; counter++; } return 0; } |
Код на ideone.com
Решение
Для решения данной задачи введем дополнительную переменную [latex]l[/latex], которая будет накапливать в себе количество напечатанных символов в строке. Каждое число в строке повторяется дважды, следовательно печатать будем число, равное целой части [latex]\left( l\div 2 \right)[/latex].
Обратим внимание на начало каждой строки. В каждой следующей строке мы сдвигаем последовательность на одно число вправо. Тогда значение переменной [latex] l[/latex] на второй строке должно быть максимально возможным [latex]\left(k\cdot2 \right)[/latex] и уменьшаться на единицу при каждом переходе на следующую строку.
Понятно. Зачёл.