Advertisement
Argent007

Fibonacci projext

Feb 9th, 2024 (edited)
641
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.68 KB | None | 0 0
  1. // ConsoleApplication1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <string>
  7. #include <iomanip>
  8. #include <cmath>
  9.  
  10. long long fibrec(int n)
  11. {
  12.     if (n < 2) return n;
  13.     return fibrec(n - 1) + fibrec(n - 2);
  14. }
  15.  
  16. const long long e15 = 1e15;
  17.  
  18. class extlong
  19. {
  20.     long long lo = 0, hi = 0;
  21. public:
  22.     extlong(long long n = 0) { lo = n % e15; hi = n / e15; }
  23.     extlong(const extlong& obj) { lo = obj.lo; hi = obj.hi; }
  24.     extlong operator+(const extlong& obj)
  25.     {
  26.         extlong res(*this);
  27.         res.lo += obj.lo;
  28.         res.hi += obj.hi + res.lo / e15;
  29.         res.lo %= e15;
  30.         return res;
  31.     }
  32.     std::string tostring() const
  33.     {
  34.         auto slo = std::to_string(lo);
  35.         if (hi == 0)
  36.             return slo;
  37.         return std::to_string(hi) + std::string(15 - slo.length(), '0') + std::to_string(lo);
  38.     }
  39.     friend std::ostream& operator<<(std::ostream& os, const extlong& obj)
  40.     {
  41.         return os << obj.tostring();
  42.     }
  43. };
  44.  
  45. const long long e8 = 1e8;
  46.  
  47. class extll
  48. {
  49.     long long hi, mid, lo;
  50. public:
  51.     extll(long long n = 0) { lo = n % e8; n /= e8; mid = n % e8; hi = n / e8; }
  52.     extll(const extll& obj) { lo = obj.lo; hi = obj.hi; mid = obj.mid; }
  53.     extll operator+(const extll& obj) const
  54.     {
  55.         extll res(*this);
  56.         res.lo += obj.lo;
  57.         res.mid += obj.mid + res.lo / e8;
  58.         res.lo %= e8;
  59.         res.hi += obj.hi + res.mid / e8;
  60.         res.mid %= e8;
  61.         return res;
  62.     }
  63.     extll operator*(const extll& obj) const
  64.     {
  65.         extll res(0);
  66.         res.lo = lo * obj.lo;
  67.         res.mid = lo * obj.mid + mid * obj.lo + res.lo / e8;
  68.         res.lo %= e8;
  69.         res.hi = lo * obj.hi + mid * obj.mid + hi * obj.lo + res.mid / e8;
  70.         res.mid %= e8;
  71.         return res;
  72.     }
  73.     std::string tostring() const
  74.     {
  75.         auto slo = std::to_string(lo);
  76.         if (hi == 0)
  77.             return std::to_string(mid * e8 + lo);
  78.         //std::format("{}{:08}{:08}", hi, mid, lo);
  79.         auto smid = std::to_string(mid);
  80.         return std::to_string(hi) + std::string(8 - smid.length(), '0') + smid+
  81.             std::string(8 - slo.length(), '0') + slo;
  82.     }
  83.     friend std::ostream& operator<<(std::ostream& os, const extll& obj)
  84.     {
  85.         return os << obj.tostring();
  86.     }
  87. };
  88.  
  89. std::vector<extlong> Fib(101);
  90.  
  91. extlong fibiter(int n)
  92. {
  93.     Fib[0] = 0;
  94.     Fib[1] = 1;
  95.     for (size_t i = 2; i < 101; i++)
  96.         Fib[i] = Fib[i - 1] + Fib[i - 2];
  97.     return Fib[n];
  98. }
  99.  
  100. double fibbine(int n)
  101. {
  102.     double sqrt5 = sqrt(5);
  103.     double L1 = (1 + sqrt5) / 2, L2 = (1 - sqrt5) / 2;
  104.     double p1 = 1, p2 = 1;
  105.     for (size_t i = 0; i < n; i++)
  106.     {
  107.         p1 *= L1;
  108.         p2 *= L2;
  109.     }
  110.     return (p1 - p2) / sqrt5;
  111. }
  112.  
  113. double fastpow(double a, int n)
  114. {
  115.     if (n == 0) return 1;
  116.     double p = fastpow(a, n / 2);
  117.     return n & 1 ? a * p * p : p * p;
  118. }
  119.  
  120. double fastpow2(double a, int n)
  121. {
  122.     double p = a;
  123.     double res = 1.0;
  124.     while (n > 0)
  125.     {
  126.         if (n & 1) res *= p;
  127.         p *= p;
  128.         n /= 2;
  129.     }
  130.     return res;
  131. }
  132.  
  133. double fibbine2(int n)
  134. {
  135.     double sqrt5 = sqrt(5);
  136.     double L1 = (1.0 + sqrt5) / 2, L2 = (1.0 - sqrt5) / 2;
  137.     double p1 = fastpow2(L1, n), p2 = fastpow2(L2, n);
  138.     return (p1 - p2) / sqrt5;
  139. }
  140.  
  141. double fibbine3(int n)
  142. {
  143.     double sqrt5 = sqrt(5);
  144.     double L1 = (1.0 + sqrt5) / 2, L2 = (1.0 - sqrt5) / 2;
  145.     double p1 = pow(L1, n), p2 = pow(L2, n);
  146.     return (p1 - p2) / sqrt5;
  147. }
  148.  
  149. std::pair<extll, extll> fibnt(int n)
  150. {
  151.     if (n == 0) return { 0,1 };
  152.     if (n == 1) return { 1,1 };
  153.     if (n % 2 == 0)
  154.     {
  155.         auto [a,b] = fibnt(n - 1);
  156.         return { b,a + b };
  157.     }
  158.     auto [a, b] = fibnt(n / 2);
  159.     return { a * a + b * b,b * (b + a + a) };
  160. }
  161.  
  162. int main()
  163. {
  164.     std::cout << std::fixed << std::setprecision(20);
  165.     for (size_t i = 0; i < 101; i++)
  166.     {
  167.         std::cout << i << ":\t" << fibiter(i) << '\t' << fibbine3(i) << '\t' << fibbine2(i) << std::endl;
  168.     }
  169.     auto [a, b] = fibnt(99);
  170.     std::cout << a<< "\t"<<b << std::endl;
  171.  
  172.     std::cout << pow(1.1, 100) << "\t" << fastpow2(1.1, 100) << std::endl;
  173.  
  174.     std::cout << "Hello World!\n";
  175. }
  176.  
  177. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  178. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  179.  
  180. // Советы по началу работы
  181. //   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  182. //   2. В окне Team Explorer можно подключиться к системе управления версиями.
  183. //   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  184. //   4. В окне "Список ошибок" можно просматривать ошибки.
  185. //   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  186. //   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
  187.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement