project-euler

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

Euler_94.cpp (1253B)


      1 #include <boost/multiprecision/cpp_dec_float.hpp>
      2 #include "Euler.h"
      3 
      4 uint64_t Euler::AlmostEquilateralTriangles()
      5 {
      6     //where s = semiperimeter (((2 * a) + b) / 2), b = a +- 1
      7     //A = sqrt(s * ((s - a) ^ 2) * (s - b))
      8     //A = sqrt((a + (b / 2)) * ((b / 2) ^ 2) * (a - (b / 2)))
      9     //A = sqrt((a + (a +- 1 / 2)) * ((a +-1 / 2) ^ 2) * (a - (a +-1 / 2)))
     10     uint64_t perimeter = 0;
     11     uint64_t bil = 1000000000;
     12 
     13     for (uint64_t side = 3; side < bil / 2; side += 2) {
     14         number<cpp_dec_float<50>> area1 = sqrt((side + ((side + 1) / 2)) * pow(((side + 1) / 2), 2) * (side - ((side + 1) / 2)));
     15         number<cpp_dec_float<50>> area2 = sqrt((side + ((side - 1) / 2)) * pow(((side - 1) / 2), 2) * (side - ((side - 1) / 2)));
     16 
     17         if (area1 == boost::multiprecision::floor(area1) && ((3 * side) + 1) < bil) {
     18             perimeter += (3 * side) + 1;
     19             //std::cout << side << ", " << side << ", " << side + 1 << ", area: " << area1 << std::endl;
     20         }
     21         if (area2 == boost::multiprecision::floor(area2) && ((3 * side) - 1) < bil) {
     22             perimeter += (3 * side) - 1;
     23             //std::cout << side << ", " << side << ", " << side - 1 << ", area: " << area2 << std::endl;
     24         }
     25     }
     26 
     27     return perimeter;
     28 }