project-euler

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

commit 027afc3bdfdf3ab1c5fbdb8f3896c94f20168497
parent 8acf35a296caafae65f26643c9381bd3e6e41e53
Author: mpizzzle <m@michaelpercival.xyz>
Date:   Thu, 24 Sep 2020 17:58:55 +0100

safety commit

Diffstat:
MEuler.h | 2++
MEuler_86.cpp | 2++
AEuler_94.cpp | 28++++++++++++++++++++++++++++
AEuler_95.cpp | 6++++++
MMakefile | 1+
Mmain.cpp | 4+++-
6 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/Euler.h b/Euler.h @@ -84,4 +84,6 @@ public: int SquareRootDigitalExpansion(); uint64_t PrimePowerTriples(); uint64_t CuboidRoute(); + uint64_t AlmostEquilateralTriangles(); + int AmicableChains(); }; diff --git a/Euler_86.cpp b/Euler_86.cpp @@ -1,5 +1,7 @@ #include "Euler.h" +//this can be sped up significantly by not recalculating previously found solutions but cba tbh fam +//precalculating all the squares might also be worth it, but would be a minor optimisation compared to above uint64_t Euler::CuboidRoute() { for (int M = 100;; ++M) { diff --git a/Euler_94.cpp b/Euler_94.cpp @@ -0,0 +1,28 @@ +#include <boost/multiprecision/cpp_dec_float.hpp> +#include "Euler.h" + +uint64_t Euler::AlmostEquilateralTriangles() +{ + //where s = semiperimeter (((2 * a) + b) / 2), b = a +- 1 + //A = sqrt(s * ((s - a) ^ 2) * (s - b)) + //A = sqrt((a + (b / 2)) * ((b / 2) ^ 2) * (a - (b / 2))) + //A = sqrt((a + (a +- 1 / 2)) * ((a +-1 / 2) ^ 2) * (a - (a +-1 / 2))) + uint64_t perimeter = 0; + uint64_t bil = 1000000000; + + for (uint64_t side = 3; side < bil / 2; side += 2) { + number<cpp_dec_float<50>> area1 = sqrt((side + ((side + 1) / 2)) * pow(((side + 1) / 2), 2) * (side - ((side + 1) / 2))); + number<cpp_dec_float<50>> area2 = sqrt((side + ((side - 1) / 2)) * pow(((side - 1) / 2), 2) * (side - ((side - 1) / 2))); + + if (area1 == boost::multiprecision::floor(area1) && ((3 * side) + 1) < bil) { + perimeter += (3 * side) + 1; + //std::cout << side << ", " << side << ", " << side + 1 << ", area: " << area1 << std::endl; + } + if (area2 == boost::multiprecision::floor(area2) && ((3 * side) - 1) < bil) { + perimeter += (3 * side) - 1; + //std::cout << side << ", " << side << ", " << side - 1 << ", area: " << area2 << std::endl; + } + } + + return perimeter; +} diff --git a/Euler_95.cpp b/Euler_95.cpp @@ -0,0 +1,6 @@ +#include "Euler.h" + +int Euler::AmicableChains() +{ + return 0; +} diff --git a/Makefile b/Makefile @@ -13,6 +13,7 @@ _OBJ = main.o Euler_61.o Euler_62.o Euler_63.o Euler_64.o Euler_68.o Euler_69.o Euler_70.o Euler_71.o Euler_72.o Euler_73.o Euler_74.o Euler_75.o Euler_76.o Euler_77.o Euler_79.o Euler_80.o Euler_86.o Euler_87.o + Euler_94.o Euler_95.o EulerUtility.o OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) diff --git a/main.cpp b/main.cpp @@ -88,8 +88,10 @@ int main() { //std::cout << "problem 78: " << "(skipped)" << std::endl; //<< e.CoinPartitions() << std::endl; //std::cout << "problem 79: " << e.PasscodeDerivation() << std::endl; //wrong //std::cout << "problem 80: " << e.SquareRootDigitalExpansion() << std::endl; - std::cout << "problem 86: " << e.CuboidRoute() << std::endl; + //std::cout << "problem 86: " << e.CuboidRoute() << std::endl; //std::cout << "problem 87: " << e.PrimePowerTriples() << std::endl; + //std::cout << "problem 94: " << e.AlmostEquilateralTriangles() << std::endl; + std::cout << "problem 95: " << e.AmicableChains() << std::endl; std::cout << "duration: " << 1000.0 * (std::clock() - start) / CLOCKS_PER_SEC << "ms" << std::endl; return 0;