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 }