Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ConsoleApplication1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
- //
- #include <iostream>
- #include <vector>
- #include <string>
- #include <iomanip>
- #include <cmath>
- long long fibrec(int n)
- {
- if (n < 2) return n;
- return fibrec(n - 1) + fibrec(n - 2);
- }
- const long long e15 = 1e15;
- class extlong
- {
- long long lo = 0, hi = 0;
- public:
- extlong(long long n = 0) { lo = n % e15; hi = n / e15; }
- extlong(const extlong& obj) { lo = obj.lo; hi = obj.hi; }
- extlong operator+(const extlong& obj)
- {
- extlong res(*this);
- res.lo += obj.lo;
- res.hi += obj.hi + res.lo / e15;
- res.lo %= e15;
- return res;
- }
- std::string tostring() const
- {
- auto slo = std::to_string(lo);
- if (hi == 0)
- return slo;
- return std::to_string(hi) + std::string(15 - slo.length(), '0') + std::to_string(lo);
- }
- friend std::ostream& operator<<(std::ostream& os, const extlong& obj)
- {
- return os << obj.tostring();
- }
- };
- const long long e8 = 1e8;
- class extll
- {
- long long hi, mid, lo;
- public:
- extll(long long n = 0) { lo = n % e8; n /= e8; mid = n % e8; hi = n / e8; }
- extll(const extll& obj) { lo = obj.lo; hi = obj.hi; mid = obj.mid; }
- extll operator+(const extll& obj) const
- {
- extll res(*this);
- res.lo += obj.lo;
- res.mid += obj.mid + res.lo / e8;
- res.lo %= e8;
- res.hi += obj.hi + res.mid / e8;
- res.mid %= e8;
- return res;
- }
- extll operator*(const extll& obj) const
- {
- extll res(0);
- res.lo = lo * obj.lo;
- res.mid = lo * obj.mid + mid * obj.lo + res.lo / e8;
- res.lo %= e8;
- res.hi = lo * obj.hi + mid * obj.mid + hi * obj.lo + res.mid / e8;
- res.mid %= e8;
- return res;
- }
- std::string tostring() const
- {
- auto slo = std::to_string(lo);
- if (hi == 0)
- return std::to_string(mid * e8 + lo);
- //std::format("{}{:08}{:08}", hi, mid, lo);
- auto smid = std::to_string(mid);
- return std::to_string(hi) + std::string(8 - smid.length(), '0') + smid+
- std::string(8 - slo.length(), '0') + slo;
- }
- friend std::ostream& operator<<(std::ostream& os, const extll& obj)
- {
- return os << obj.tostring();
- }
- };
- std::vector<extlong> Fib(101);
- extlong fibiter(int n)
- {
- Fib[0] = 0;
- Fib[1] = 1;
- for (size_t i = 2; i < 101; i++)
- Fib[i] = Fib[i - 1] + Fib[i - 2];
- return Fib[n];
- }
- double fibbine(int n)
- {
- double sqrt5 = sqrt(5);
- double L1 = (1 + sqrt5) / 2, L2 = (1 - sqrt5) / 2;
- double p1 = 1, p2 = 1;
- for (size_t i = 0; i < n; i++)
- {
- p1 *= L1;
- p2 *= L2;
- }
- return (p1 - p2) / sqrt5;
- }
- double fastpow(double a, int n)
- {
- if (n == 0) return 1;
- double p = fastpow(a, n / 2);
- return n & 1 ? a * p * p : p * p;
- }
- double fastpow2(double a, int n)
- {
- double p = a;
- double res = 1.0;
- while (n > 0)
- {
- if (n & 1) res *= p;
- p *= p;
- n /= 2;
- }
- return res;
- }
- double fibbine2(int n)
- {
- double sqrt5 = sqrt(5);
- double L1 = (1.0 + sqrt5) / 2, L2 = (1.0 - sqrt5) / 2;
- double p1 = fastpow2(L1, n), p2 = fastpow2(L2, n);
- return (p1 - p2) / sqrt5;
- }
- double fibbine3(int n)
- {
- double sqrt5 = sqrt(5);
- double L1 = (1.0 + sqrt5) / 2, L2 = (1.0 - sqrt5) / 2;
- double p1 = pow(L1, n), p2 = pow(L2, n);
- return (p1 - p2) / sqrt5;
- }
- std::pair<extll, extll> fibnt(int n)
- {
- if (n == 0) return { 0,1 };
- if (n == 1) return { 1,1 };
- if (n % 2 == 0)
- {
- auto [a,b] = fibnt(n - 1);
- return { b,a + b };
- }
- auto [a, b] = fibnt(n / 2);
- return { a * a + b * b,b * (b + a + a) };
- }
- int main()
- {
- std::cout << std::fixed << std::setprecision(20);
- for (size_t i = 0; i < 101; i++)
- {
- std::cout << i << ":\t" << fibiter(i) << '\t' << fibbine3(i) << '\t' << fibbine2(i) << std::endl;
- }
- auto [a, b] = fibnt(99);
- std::cout << a<< "\t"<<b << std::endl;
- std::cout << pow(1.1, 100) << "\t" << fastpow2(1.1, 100) << std::endl;
- std::cout << "Hello World!\n";
- }
- // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
- // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
- // Советы по началу работы
- // 1. В окне обозревателя решений можно добавлять файлы и управлять ими.
- // 2. В окне Team Explorer можно подключиться к системе управления версиями.
- // 3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
- // 4. В окне "Список ошибок" можно просматривать ошибки.
- // 5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
- // 6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement