Написал в свое время программку для чисел Фибоначчи =] Делать было нечего, дело было вечером, а задание нашел интересное =] В итоге из-под рук вышло сие творение:
#includeusing namespace std; typedef long long i64;/*64 бита*/ i64 fib[100], mas[100], fibc[100], N; i64 recurs(i64 n, i64 N) {/**/ if (N == 0 || N == 1) return N; if (N < fib[n-1]) return recurs(n-1,N); else { N -= fib[n-1]; return mas[n-1]+N+recurs(n-2,N); } } i64 rec(i64 r, i64 n, i64 N) { if (r <= 0) return 0; if (N < fib[n+1]) return rec(r-1, n-1, N); return 1+rec(r-2, n-2, N-fib[n+1]); } i64 main () { ifstream in("input.txt"); ofstream out("output.txt"); i64 Q = 0; fib[1] = 1; mas[1] = 1; fibc[1] = 1; for (i64 i = 2; i < 100; i++) { fib[i] = fib[i-1] + fib[i-2]; mas[i] = fib[i] + fibc[i-2]; fibc[i] = mas[i] + fibc[i-1]; } in >> N; i64 n; for (n = 1; n * fib[n] <= N; n++) N -= n*fib[n], Q += mas[n]; i64 tmp = N % n; N /= n; out << Q + recurs(n,N) + rec(tmp,n,N+fib[n+1]); return 0; }
Программулина берет число Фибоначчи (точнее его порядковый номер), ищет его целочисленное значение и потом преобразует его в систему счисления Фибоначчи =]
Число на вход находится в файлике input.txt, а на выход — в файлике output.txt
По ходу движения мы рекурсивной функцией мы преобразуем число в двоичный код системы счисления Фибоначчи (исходя из правила, что 2 еденицы подряд идти не могут).
Собственно код уже описан выше — кому нужно — тот возмет =]