diff --git a/headers/ProblemSelection.hpp b/headers/ProblemSelection.hpp index 5a32270..e7f9bee 100644 --- a/headers/ProblemSelection.hpp +++ b/headers/ProblemSelection.hpp @@ -61,6 +61,7 @@ #include "Problems/Problem33.hpp" #include "Problems/Problem34.hpp" #include "Problems/Problem35.hpp" +#include "Problems/Problem36.hpp" #include "Problems/Problem67.hpp" @@ -68,7 +69,7 @@ std::vector PROBLEM_NUMBERS = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 67}; + 31, 32, 33, 34, 35, 36, 67}; //This function returns a pointer to a problem of type number Problem* getProblem(unsigned int problemNumber){ @@ -111,6 +112,7 @@ Problem* getProblem(unsigned int problemNumber){ case 33 : problem = new Problem33; break; case 34 : problem = new Problem34; break; case 35 : problem = new Problem35; break; + case 36 : problem = new Problem36; break; case 67 : problem = new Problem67; break; } diff --git a/headers/Problems/Problem35.hpp b/headers/Problems/Problem35.hpp index 039e6ac..41ce025 100644 --- a/headers/Problems/Problem35.hpp +++ b/headers/Problems/Problem35.hpp @@ -47,7 +47,7 @@ public: virtual void solve(); //Solve the problem virtual void reset(); //Reset the problem so it can be run again //Gets - virtual std::string getResult(); //Returns a string with the solutino to the problem + virtual std::string getResult(); //Returns a string with the solution to the problem std::vector getPrimes(); //Returns the vector of primes < MAX_NUM std::vector getCircularPrimes(); //Returns the vector of circular primes < MAX_NUM int getNumCircularPrimes(); //Returns the number of circular primes diff --git a/headers/Problems/Problem36.hpp b/headers/Problems/Problem36.hpp new file mode 100644 index 0000000..d8df0dd --- /dev/null +++ b/headers/Problems/Problem36.hpp @@ -0,0 +1,60 @@ +//ProjectEuler/ProjectEulerCPP/headers/Problems/Problem36.hpp +//Matthew Ellison +// Created: 06-29-21 +//Modified: 06-29-21 +//Find the sum of all numbers, less than one million, which are palindromic in base 10 and base 2. +//Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses +/* + Copyright (C) 2021 Matthew Ellison + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef PROBLEM36_HPP +#define PROBLEM36_HPP + + +#include +#include +#include "Problem.hpp" +#include "Algorithms.hpp" + + +class Problem36 : public Problem{ +private: + //Variables + //Static variables + static int MAX_NUM; //The largest number that will be checked + //Instance variables + std::vector palindromes; //All numbers that are palindromes in base 10 and 2 + int sum; //The sum of all elements in the vector palindromes +public: + //Constructor + Problem36(); + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getResult(); //Returns a string with the solution to the problem + std::vector getPalindromes(); //Return the vector of palindromes < MAX_NUM + int getSumOfPalindromes(); //Return the sum of all elements in the vector of palindromes +}; + +/* Results: +The sum of all base 10 and base 2 palindromic numbers < 999999 is 872187 +It took an average of 22.578 milliseconds to run this problem over 100 iterations +*/ + + +#endif //PROBLEM36_HPP diff --git a/makefile b/makefile index 1ed1cd8..aa5d366 100644 --- a/makefile +++ b/makefile @@ -3,7 +3,7 @@ NUMCORESWIN = ${NUMBER_OF_PROCESSORS} LIBFLAGS = -shared -std=c++17 -O3 -fPIC -Wall EXEFLAGS = -Wall -std=c++17 -O3 -Wl,-rpath,'$$ORIGIN/lib' LINKEDLIBS = -lgmp -lgmpxx -PROBLEM_NUMBERS = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 67 +PROBLEM_NUMBERS = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 67 SOURCE_DIR = src PROBLEM_DIR = $(SOURCE_DIR)/Problems INCLUDE_DIR = headers diff --git a/src/Problems/Problem35.cpp b/src/Problems/Problem35.cpp index 4d23638..c39e8fd 100644 --- a/src/Problems/Problem35.cpp +++ b/src/Problems/Problem35.cpp @@ -25,6 +25,7 @@ #include +#include #include #include "Problems/Problem35.hpp" #include "Algorithms.hpp" diff --git a/src/Problems/Problem36.cpp b/src/Problems/Problem36.cpp new file mode 100644 index 0000000..624d2ab --- /dev/null +++ b/src/Problems/Problem36.cpp @@ -0,0 +1,105 @@ +//ProjectEuler/ProjectEulerCPP/src/Problems/Problem36.cpp +//Matthew Ellison +// Created: 06-29-21 +//Modified: 06-29-21 +//Find the sum of all numbers, less than one million, which are palindromic in base 10 and base 2. +//Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses +/* + Copyright (C) 2021 Matthew Ellison + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + + +#include +#include +#include +#include "Problems/Problem36.hpp" +#include "Algorithms.hpp" +#include + + +//The largest number that will be checked +int Problem36::MAX_NUM = 999999; + +//Constructor +Problem36::Problem36() : Problem("Find the sum of all numbers, less than one million, which are palindromic in base 10 and base 2."), sum(0){ +} + +//Operational functions +//Solve the problem +void Problem36::solve(){ + //If the problem has already been solved do nothing and end the function + if(solved){ + return; + } + + //Start the timer + timer.start(); + + //Start with 1, check if it is a palindrome in base 10 and 2, and continue to MAX_NUM + for(int num = 1;num < MAX_NUM;++num){ + //Check if num is a palindrome + if(mee::isPalindrome(std::to_string(num))){ + //Convert num to base 2 and see if that is a palindrome + std::string binNum = mee::toBin(num); + if(mee::isPalindrome(binNum)){ + //Add num to the vector of palindromes + palindromes.push_back(num); + } + } + } + //Get the sum of all palindromes in the vector + sum = mee::getSum(palindromes); + + //Stop the timer + timer.stop(); + + //Throw a flag to show the problem is solved + solved = true; +} +//Reset the problem so it can be run again +void Problem36::reset(){ + Problem::reset(); + palindromes.clear(); + sum = 0; +} + +//Gets +//Returns a string with the solution to the problem +std::string Problem36::getResult(){ + //If the problem hasn't been solved throw an exception + if(!solved){ + throw Unsolved(); + } + std::stringstream result; + result << "The sum of all base 10 and base 2 palindromic numbers < " << MAX_NUM << " is " << sum; + return result.str(); +} +//Return the vector of palindromes < MAX_NUM +std::vector Problem36::getPalindromes(){ + //If the problem hasn't been solved throw an exception + if(!solved){ + throw Unsolved(); + } + return palindromes; +} +//Return the sum of all elements in the vector of palindromes +int Problem36::getSumOfPalindromes(){ + //If the problem hasn't been solved throw an exception + if(!solved){ + throw Unsolved(); + } + return sum; +} \ No newline at end of file