Условие
Найдите закономерность и напишите программу, которая выводит аналогичную таблицу для любых чисел [latex]n > 0[/latex] (количество столбцов) и [latex]m > 0[/latex] (количество строк).
1123581321345589144233377
1235813213455891442333776
2358132134558914423337761
3581321345589144233377610
5813213455891442333776109
Входные данные
В одной строке задано два числа [latex]n[/latex] и [latex]m[/latex].
Выходные данные
Вывести таблицу размерностью [latex]n\times m[/latex].
Тесты
Входные данные | Выходные данные | ||
1 1 | 1 | ||
2 2 |
|
||
5 5 |
|
||
9 18 |
|
||
25 5 |
|
Код
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 50 51 |
#include <iostream> #include <cmath> using namespace std; int f(int a) { int b=1; for (int i=0; i<a; i++) { b*=10; } return b; } int g(int a) { return (a==0 ? 1 : floor(log10(a))+1); } void h(int &i, int &j, int &a, int &b, int &a1, int &b1) { cout << endl; a=a1; b=b1; i++; j=0; } int main() { int n, m, a=1, b=0, c, a1=0, b1=1; cin >> n >> m; int i=1, j=0; while (i<=m) { if (j==n) { h(i, j, a, b, a1, b1); } c=a+b; a=b; b=c; if (j==0) { a1=a; b1=b; } if (j+g(c)>n) { // если текущее число Фибоначчи выходит за предел строки cout << c/f(g(c)-n+j); // печатаем ту часть что не выходит за ее предел h(i, j, a, b, a1, b1); } else if (i<=m) { cout << c; j+=g(c); } } return 0; } |
Решение
Несложно догадаться что данная последовательность чисел это числа Фибоначчи. Для того чтобы построить таблицу надо сначала найти числа Фибоначчи (у меня это — [latex]a,b,c[/latex]), после печатаем их в строку далее переходим на новую строку и начинаем со 2 элемента относительно предыдущей строки это выполняет функция [latex]h[/latex], и так пока [latex]i \le m[/latex]. Но может возникнуть проблема с выходом за предел строки и для того чтобы этого не произошло нам нужны функции [latex]f[/latex], которая возводит 10 в заданную степень, это нам надо чтобы отрезать то что выходит за предел строки, для этого используем целочисленное деление на 10 в нужной степени, и [latex]g[/latex], которая считает количество цифр в данном числе Фибоначчи, для того чтобы определить в какую степень нам надо возвести 10, чтобы оставить только ту часть что не выходит за предел строки.
Код программы