project-euler

https://projecteuler.net/
Log | Files | Refs | README

Euler_65.cpp (1244B)


      1 #include <numeric>
      2 
      3 #include "Euler.h"
      4 
      5 std::vector<BigInteger> recurseFraction2(std::vector<BigInteger> period, BigInteger n, std::vector<BigInteger> fraction)
      6 {
      7     if (n > period.size() - 1)
      8         return fraction;
      9 
     10     std::swap(fraction[0], fraction[1]);
     11 
     12     fraction[0] = (fraction[1] * period[period.size() - n.toInt() - 1]) + fraction[0];
     13 
     14     return recurseFraction2(period, n + 1, fraction);
     15 }
     16 
     17 std::vector<BigInteger> recurseFraction2(std::vector<BigInteger> period, BigInteger n)
     18 {
     19     std::vector<BigInteger> fraction;
     20 
     21     fraction.push_back(period[period.size() - 1]);
     22     fraction.push_back(1);
     23 
     24     return recurseFraction2(period, 1, fraction);
     25 }
     26 
     27 BigInteger periodiuy()
     28 {
     29     std::vector<BigInteger> period;
     30 
     31     period.push_back(2);
     32 
     33     int n = 2;
     34 
     35     for (int i = 1; i < 100; ++i)
     36     {
     37         if (i % 3 == 2)
     38         {
     39             period.push_back(n);
     40             n += 2;
     41         }
     42         else
     43         {
     44             period.push_back(1);
     45         }
     46     }
     47 
     48     
     49     std::vector<BigInteger> approx = recurseFraction2(period, 0);
     50     return approx[0];
     51 }
     52 
     53 int Euler::ConvergentsOfE()
     54 {
     55     std::vector<int> digits = EulerUtility::BigIntToDigits(periodiuy());
     56 
     57     return std::accumulate(digits.begin(), digits.end(), 0);
     58 }