From c72754dcf870cdfd08d72be3d68cd1950a8630ff Mon Sep 17 00:00:00 2001 From: Mattrixwv Date: Fri, 10 Jul 2020 13:36:16 -0400 Subject: [PATCH] Updated comments and made sure style was consistent --- Headers/Problem.hpp | 29 ++++++++++++++++++---- Headers/Problem1.hpp | 25 +++++++++++-------- Headers/Problem10.hpp | 23 +++++++++++------- Headers/Problem11.hpp | 31 +++++++++++++----------- Headers/Problem12.hpp | 32 +++++++++++++------------ Headers/Problem13.hpp | 36 +++++++++++++++------------- Headers/Problem14.hpp | 31 ++++++++++++++---------- Headers/Problem15.hpp | 27 +++++++++++++-------- Headers/Problem16.hpp | 26 +++++++++++--------- Headers/Problem17.hpp | 32 +++++++++++++++---------- Headers/Problem18.hpp | 40 ++++++++++++++++++------------- Headers/Problem19.hpp | 33 +++++++++++++------------ Headers/Problem2.hpp | 23 +++++++++++------- Headers/Problem20.hpp | 28 ++++++++++++---------- Headers/Problem21.hpp | 30 +++++++++++++---------- Headers/Problem22.hpp | 32 +++++++++++++++---------- Headers/Problem23.hpp | 32 +++++++++++++++---------- Headers/Problem24.hpp | 25 ++++++++++--------- Headers/Problem25.hpp | 20 ++++++++++------ Headers/Problem26.hpp | 20 ++++++++++------ Headers/Problem27.hpp | 25 +++++++++++-------- Headers/Problem28.hpp | 25 ++++++++++++------- Headers/Problem29.hpp | 38 ++++++++++++++++------------- Headers/Problem3.hpp | 31 +++++++++++++----------- Headers/Problem30.hpp | 28 ++++++++++++++-------- Headers/Problem31.hpp | 25 +++++++++++-------- Headers/Problem4.hpp | 30 +++++++++++++---------- Headers/Problem5.hpp | 24 +++++++++++-------- Headers/Problem6.hpp | 33 +++++++++++++------------ Headers/Problem67.hpp | 28 ++++++++++++++-------- Headers/Problem7.hpp | 25 +++++++++++-------- Headers/Problem8.hpp | 28 ++++++++++++---------- Headers/Problem9.hpp | 35 ++++++++++++++------------- Source/Problem1.cpp | 56 +++++++++++++++++++++++++------------------ Source/Problem10.cpp | 29 ++++++++++++---------- Source/Problem11.cpp | 25 ++++++++++++------- Source/Problem12.cpp | 29 ++++++++++++++-------- Source/Problem13.cpp | 48 +++++++++++++++++++++---------------- Source/Problem14.cpp | 30 ++++++++++++++--------- Source/Problem15.cpp | 27 +++++++++++++-------- Source/Problem16.cpp | 25 ++++++++++++------- Source/Problem17.cpp | 31 +++++++++++++++--------- Source/Problem18.cpp | 35 +++++++++++++++++---------- Source/Problem19.cpp | 29 +++++++++++++--------- Source/Problem2.cpp | 22 ++++++++++------- Source/Problem20.cpp | 25 ++++++++++++------- Source/Problem21.cpp | 36 +++++++++++++++++----------- Source/Problem22.cpp | 34 +++++++++++++++----------- Source/Problem23.cpp | 52 +++++++++++++++++++++++----------------- Source/Problem24.cpp | 27 ++++++++++++--------- Source/Problem25.cpp | 23 +++++++++++------- Source/Problem26.cpp | 25 ++++++++++++------- Source/Problem27.cpp | 25 ++++++++++++------- Source/Problem28.cpp | 36 ++++++++++++++++------------ Source/Problem29.cpp | 34 +++++++++++++++++++------- Source/Problem3.cpp | 24 ++++++++++++------- Source/Problem30.cpp | 31 ++++++++++++++++-------- Source/Problem31.cpp | 19 +++++++++------ Source/Problem4.cpp | 24 ++++++++++++------- Source/Problem5.cpp | 21 +++++++++------- Source/Problem6.cpp | 27 +++++++++++++-------- Source/Problem67.cpp | 33 ++++++++++++++----------- Source/Problem7.cpp | 20 ++++++++++------ Source/Problem8.cpp | 25 ++++++++++++------- Source/Problem9.cpp | 30 ++++++++++++++--------- 65 files changed, 1160 insertions(+), 747 deletions(-) diff --git a/Headers/Problem.hpp b/Headers/Problem.hpp index bba760c..3e10ead 100644 --- a/Headers/Problem.hpp +++ b/Headers/Problem.hpp @@ -1,8 +1,25 @@ -//ProjectEuler/C++/Headers/Problem.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem.hpp //Matthew Ellison // Created: 07-04-19 -//Modified: 07-10-19 +//Modified: 07-09-20 //This is an abstract base class to allow polymorphism for the individual problems +/* + Copyright (C) 2020 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 PROBLEM_HPP #define PROBLEM_HPP @@ -25,9 +42,11 @@ public: Problem(std::string description) : description(description), solved(false){ } + //Destructor virtual ~Problem(){ } + //Gets virtual std::string getDescription() const{ return description; } @@ -37,12 +56,14 @@ public: virtual mee::Stopwatch getTimer(){ return timer; } - virtual void solve() = 0; - virtual std::string getString() const = 0; + //Reset the problem so it can be run again virtual void reset(){ timer.reset(); solved = false; } + //Pure virtual functions + virtual void solve() = 0; //Solve the problem + virtual std::string getString() const = 0; //Return a string with the solution to the problem }; #endif //PROBLEM_HPP diff --git a/Headers/Problem1.hpp b/Headers/Problem1.hpp index 466d7e2..8dd8123 100644 --- a/Headers/Problem1.hpp +++ b/Headers/Problem1.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem1.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem1.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the sum of all the multiples of 3 or 5 that are less than 1000 //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -33,21 +33,26 @@ class Problem1: public Problem{ private: - static uint64_t MAX_NUMBER; + //Variables + //Static variables + static uint64_t MAX_NUMBER; //The highest number to be tested + //Instance variables uint64_t fullSum; //For the sum of all the numbers std::vector numbers; //Holds all the numbers public: + //Constructor Problem1(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the requested sum - uint64_t getSum() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + uint64_t getSum() const; //Returns the requested sum }; /* Results: The sum of all the numbers < 1000 that are divisible by 3 or 5 is 233168 -It took 4.500 microseconds to solve this problem. +It took an average of 957.000 nanoseconds to run this problem over 100 iterations */ #endif //PROBLEM1_HPP diff --git a/Headers/Problem10.hpp b/Headers/Problem10.hpp index c928317..561a2b3 100644 --- a/Headers/Problem10.hpp +++ b/Headers/Problem10.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem10.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem10.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the sum of all the primes below two million //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,20 +32,25 @@ class Problem10 : public Problem{ private: + //Variables + //Static variables static uint64_t GOAL_NUMBER; + //Instance variables uint64_t sum; public: + //Constructor Problem10(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the sum that was requested - uint64_t getSum() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + uint64_t getSum() const; //Returns the sum that was requested }; /* Results: The sum of all the primes less than 2000000 is 142913828922 -It took 162.240 milliseconds to solve this problem. +It took an average of 171.141 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM10_HPP diff --git a/Headers/Problem11.hpp b/Headers/Problem11.hpp index d76fae3..2f26f09 100644 --- a/Headers/Problem11.hpp +++ b/Headers/Problem11.hpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Headers/Problem11.hpp -//MatthewEllison +//ProjectEuler/ProjectEulerCPP/Headers/Problem11.hpp +//Matthew Ellison // Created: 09-29-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid? /* 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 @@ -27,7 +27,7 @@ */ //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -54,24 +54,27 @@ class Problem11 : public Problem{ private: - //This is the grid of number that we will be working with - static std::vector grid[20]; + //Variables + //Static variables + static std::vector grid[20]; //This is the grid of number that we will be working with + //Instance variables std::vector greatestProduct; //This is a vector containing the largest product we have found so far public: + //Constructor Problem11(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the numbers that were being searched - std::vector getNumbers() const; - //Returns the product that was requested - int getProduct() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + std::vector getNumbers() const; //Returns the numbers that were being searched + int getProduct() const; //Returns the product that was requested }; /* Results: The greatest product of 4 number in a line is 70600674 The numbers are 89 94 97 87 -It took 12.900 microseconds to solve this problem +It took an average of 11.201 microseconds to run this problem over 100 iterations */ #endif //PROBLEM11_HPP diff --git a/Headers/Problem12.hpp b/Headers/Problem12.hpp index ad6fd76..e4e8990 100644 --- a/Headers/Problem12.hpp +++ b/Headers/Problem12.hpp @@ -1,10 +1,10 @@ -//ProjectEuler/C++/Headers/Problem12.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem12.hpp //Matthew Ellison // Created: 09-27-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the value of the first triangle number to have over five hundred divisors? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses -/* Copyright (C) 2019 Matthew Ellison +/* Copyright (C) 2020 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 @@ -32,29 +32,31 @@ class Problem12 : public Problem{ private: + //Variables + //Static variables static uint64_t GOAL_DIVISORS; //The number of divisors that you want + //Instance variables int64_t sum; //The sum of the numbers up to counter int64_t counter; //The next number to be added to sum std::vector divisors; //Holds the divisors of the triangular number sum public: + //Constructor Problem12(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the triangular number - int64_t getTriangularNumber() const; - //Get the final number that was added to the triangular number - int64_t getLastNumberAdded() const; - //Returns the list of divisors of the requested number - std::vector getDivisorsOfTriangularNumber() const; - //Returns the number of divisors of the requested number - size_t getNumberOfDivisors() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + int64_t getTriangularNumber() const; //Returns the triangular number + int64_t getLastNumberAdded() const; //Get the final number that was added to the triangular number + std::vector getDivisorsOfTriangularNumber() const; //Returns the list of divisors of the requested number + size_t getNumberOfDivisors() const; //Returns the number of divisors of the requested number }; /* Results: The triangular number 76576500 is a sum of all numbers >= 12375 and has 576 divisors -It took 262.765 milliseconds to solve this problem. +It took an average of 280.536 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM12_HPP diff --git a/Headers/Problem13.hpp b/Headers/Problem13.hpp index 7c48629..33febb2 100644 --- a/Headers/Problem13.hpp +++ b/Headers/Problem13.hpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Headers/Problem13.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem13.hpp //Matthew Ellison // Created: 09-29-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Work out the first ten digits of the sum of the following one-hundred 50-digit numbers /* 37107287533902102798797998220837590246510135740250 @@ -110,7 +110,7 @@ //You can find more information about them at https://gmplib.org/ //When compiling this file you need to have the gmp library installed as well as linking the libraries to your executable using the -lgmpxx and -lgmp flags /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -139,27 +139,31 @@ class Problem13 : public Problem{ private: - //A vector to hold all of the numbers - std::vector nums; - mpz_class sum; - void setNums(); - void reserveVectors(); + //Variables + //Instance variables + std::vector nums; //A vector to hold all of the numbers + mpz_class sum; //The sum of all the numbers + + //Functions + void setNums(); //A function to set the nums vector + void reserveVectors(); //Reserve the size of the vector to speed up insertion public: + //Constructor Problem13(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the list 50-digit numbers - std::vector getNumbers() const; - //Returns the sum of the 50-digit numbers - mpz_class getSum() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + std::vector getNumbers() const; //Returns the list 50-digit numbers + mpz_class getSum() const; //Returns the sum of the 50-digit numbers }; /* Results: The sum of all 100 numbers is 5537376230390876637302048746832985971773659831892672 The first 10 digits of the sum of the numbers is 5537376230 -It took 0.000 nanoseconds to solve this problem. +It took an average of 13.270 microseconds to run this problem over 100 iterations */ #endif //PROBLEM13_HPP diff --git a/Headers/Problem14.hpp b/Headers/Problem14.hpp index 3d89c78..4d97cac 100644 --- a/Headers/Problem14.hpp +++ b/Headers/Problem14.hpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Headers/Problem14.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem14.hpp //Matthew Ellison // Created: 09-29-18 -//Modified: 07-14-19 +//Modified: 07-09-20 /* The following iterative sequence is defined for the set of positive integers: n → n/2 (n is even) @@ -10,7 +10,7 @@ Which starting number, under one million, produces the longest chain? */ //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -37,25 +37,30 @@ Which starting number, under one million, produces the longest chain? class Problem14 : public Problem{ private: - //This function follows the rules of the sequence and returns its length - uint64_t checkSeries(uint64_t num); + //Variables + //Static variables static uint64_t MAX_NUM; //This is the top number that you will be checking against the series + //Instance variables uint64_t maxLength; //This is the length of the longest chain uint64_t maxNum; //This is the starting number of the longest chain + + //Function + uint64_t checkSeries(uint64_t num); //This function follows the rules of the sequence and returns its length public: + //Constructor Problem14(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the length of the requested chain - uint64_t getLength() const; - //Returns the starting number of the requested chain - uint64_t getStartingNumber() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + uint64_t getLength() const; //Returns the length of the requested chain + uint64_t getStartingNumber() const; //Returns the starting number of the requested chain }; /* Results: The number 837799 produced a chain of 525 steps -It took 153.999 milliseconds to solve this problem. +It took an average of 197.008 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM14_HPP diff --git a/Headers/Problem15.hpp b/Headers/Problem15.hpp index 24e3d64..41a087a 100644 --- a/Headers/Problem15.hpp +++ b/Headers/Problem15.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem15.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem15.hpp //Matthew Ellison // Created: 09-29-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //How many routes from the top left corner to the bottom right corner are there through a 20×20 grid if you can only move right and down? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,23 +32,30 @@ class Problem15 : public Problem{ private: + //Variables + //Static variables static int WIDTH; //The width of the grid static int LENGTH; //The length of the grid + //Instance variables uint64_t numOfRoutes; //The number of routes from 0, 0 to 20, 20 + + //Functions //This function acts as a handler for moving the position on the grid and counting the distance - //If moves right first, then down + //It moves right first, then down void move(int currentX, int currentY, uint64_t& numOfRoutes); public: + //Constructor Problem15(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the number of routes found - uint64_t getNumberOfRoutes() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + uint64_t getNumberOfRoutes() const; //Returns the number of routes found }; /* Results: The number of routes is 137846528820 -It took 10.914 minutes to solve this problem. +It took an average of 18.010 minutes to run this problem through 10 iterations */ #endif //PROBLEM15_HPP diff --git a/Headers/Problem16.hpp b/Headers/Problem16.hpp index db411b1..4865a1c 100644 --- a/Headers/Problem16.hpp +++ b/Headers/Problem16.hpp @@ -1,14 +1,14 @@ -//ProjectEuler/C++/Headers/Problem16.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem16.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the sum of the digits of the number 2^1000? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses //This file contains a header from the gmp library. The library is used for large integers. //You can find more information about them at https://gmplib.org/ //When compiling this file you need to have the gmp library installed as well as linking the libraries to your executable using the -lgmpxx and -lgmp flags /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -35,25 +35,29 @@ class Problem16 : public Problem{ private: + //Variables + //Static variables static int NUM_TO_POWER; //The number that is going to be raised to a power static int POWER; //The power that the number is going to be raised to + //Instance variables mpz_class num; //The number to be calculated int sumOfElements; //The sum of all digits in the number public: + //Constructors Problem16(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the number that was calculated - mpz_class getNumber() const; - //Return the sum of the digits of the number - int getSum() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + mpz_class getNumber() const; //Returns the number that was calculated + int getSum() const; //Return the sum of the digits of the number }; /* Results: 2^1000 = 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 The sum of the elements is 1366 -It took 0.000 nanoseconds to solve this problem. +It took an average of 4.806 microseconds to run this problem over 100 iterations */ #endif //PROBLEM16_HPP diff --git a/Headers/Problem17.hpp b/Headers/Problem17.hpp index 6d35b20..9321a9d 100644 --- a/Headers/Problem17.hpp +++ b/Headers/Problem17.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem17.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem17.hpp //Matthew Ellison // Created: 10-05-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,23 +32,29 @@ class Problem17 : public Problem{ private: - std::string makeWord(int num); - std::string wordHelper(int num); - uint64_t countLetters(std::string str); - + //Variables + //Static variables static int TOP_NUM; //This is the largest number to get the words of + //Instance variables uint64_t letterCount; //This is the cumulative number of letters in the words of the numbers + + //Functions + std::string makeWord(int num); //This function makes a word out of the number passed into it + std::string wordHelper(int num); //This function helps makeWord() by returning the words for the numbers 1-9 + uint64_t countLetters(std::string str); //This counts the number of letters in the string that is passed in (ignoring numbers and punctuation) public: + //Constructor Problem17(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the number of letters asked for - uint64_t getLetterCount() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + uint64_t getLetterCount() const; //Returns the number of letters asked for }; /* Results: The number of letters is 21124 -It took 217.500 microseconds to solve this problem. +It took an average of 220.126 microseconds to run this problem over 100 iterations */ #endif //Problem17_HPP diff --git a/Headers/Problem18.hpp b/Headers/Problem18.hpp index e1c98e7..0207557 100644 --- a/Headers/Problem18.hpp +++ b/Headers/Problem18.hpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Headers/Problem18.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem18.hpp //Matthew Ellison // Created: 11-01-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the maximum total from top to bottom /* 75 @@ -23,7 +23,7 @@ //This is done using a breadth first search //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -51,6 +51,8 @@ class Problem18 : public Problem{ private: + //Structures + //A structure to hold the location data for a point on the map struct location{ int xLocation; int yLocation; @@ -58,30 +60,34 @@ private: bool fromRight; location(int x, int y, int t, bool r) : xLocation(x), yLocation(y), total(t), fromRight(r){ } }; - //This list turns every number in the vector into 100 - num - void invert(); + + //Variables + //Static variables static const int NUM_ROWS = 15; //The number of rows in the array - //Setup the list you are trying to find a path through - static std::vector list[NUM_ROWS]; + static std::vector list[NUM_ROWS]; //Setup the list you are trying to find a path through + //Instance variables std::list foundPoints; //For the points that I have already found the shortest distance to std::list possiblePoints; //For the locations you are checking this round int actualTotal; //The true total of the path from the top to the bottom + + //Functions + void invert(); //This list turns every number in the vector into 100 - num public: + //Constructor Problem18(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the pyramid that was traversed as a string - std::string getPyramid(); - //Returns the trail the algorithm took as a string - std::string getTrail(); - //Returns the total that was asked for - int getTotal() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + std::string getPyramid(); //Returns the pyramid that was traversed as a string + std::string getTrail(); //Returns the trail the algorithm took as a string + int getTotal() const; //Returns the total that was asked for }; /* Results: The value of the longest path is 1074 -It took 16.500 microseconds to solve this problem. +It took an average of 9.925 microseconds to run this problem over 100 iterations */ #endif //PROBLEM18_HPP diff --git a/Headers/Problem19.hpp b/Headers/Problem19.hpp index 572df4a..1ce7752 100644 --- a/Headers/Problem19.hpp +++ b/Headers/Problem19.hpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Headers/Problem19.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem19.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)? /* You are given the following information, but you may prefer to do some research for yourself. @@ -16,7 +16,7 @@ A leap year occurs on any year evenly divisible by 4, but not on a century unles */ //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -43,28 +43,31 @@ A leap year occurs on any year evenly divisible by 4, but not on a century unles class Problem19 : public Problem{ private: -//Variables + //Variables + //Staic variables //An easier way to return the days enum DAYS {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, NUMBER_OF_DAYS, ERROR}; static unsigned int START_YEAR; //The start year static unsigned int END_YEAR; //The stop year + //Instance variables uint64_t totalSundays; //Keep track of the number of sundays -//Functions - //Return the day of the week that the date you pass into it is on - DAYS getDay(unsigned int month, unsigned int day, unsigned int year); - //Returns true if the year passed to it is a leap year - bool isLeapYear(unsigned int year); + + //Functions + DAYS getDay(unsigned int month, unsigned int day, unsigned int year); //Return the day of the week that the date you pass into it is on + bool isLeapYear(unsigned int year); //Returns true if the year passed to it is a leap year public: + //Constructors Problem19(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the total sundays that were asked for - uint64_t getTotalSundays() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + uint64_t getTotalSundays() const; //Returns the total sundays that were asked for }; /* Results There are 171 Sundays that landed on the first of the months from 1901 to 2000 -It took 4.579 milliseconds to solve this problem. +It took an average of 4.749 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM19_HPP diff --git a/Headers/Problem2.hpp b/Headers/Problem2.hpp index 78807a7..6f38c64 100644 --- a/Headers/Problem2.hpp +++ b/Headers/Problem2.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem2.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem2.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //The sum of the even Fibonacci numbers less than 4,000,000 //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,20 +32,25 @@ class Problem2 : public Problem{ private: + //Variables + //Static variables static uint64_t TOP_NUM; //Holds the largest number that we are looking for + //Instance variables uint64_t fullSum; //Holds the sum of all the numbers public: + //Constructor Problem2(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the requested sum - uint64_t getSum() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + uint64_t getSum() const; //Returns the requested sum }; /* Results: The sum of the even Fibonacci numbers less than 4,000,000 is 4613732 -It took 2.200 microseconds to solve this problem. +It took an average of 324.000 nanoseconds to run this problem over 100 iterations */ #endif //PROBLEM2_HPP diff --git a/Headers/Problem20.hpp b/Headers/Problem20.hpp index 58597dd..458b217 100644 --- a/Headers/Problem20.hpp +++ b/Headers/Problem20.hpp @@ -1,14 +1,14 @@ -//ProjectEuler/C++/Headers/Problem20.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem20.hpp //Matthew Ellison // Created: 11-07-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the sum of the digits of 100!? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses //This file contains a header from the gmp library. The library is used for large integers. //You can find more information about them at https://gmplib.org/ //When compiling this file you need to have the gmp library installed as well as linking the libraries to your executable using the -lgmpxx and -lgmp flags /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -36,25 +36,27 @@ class Problem20 : public Problem{ private: + //Variables + //Instance variables mpz_class num; //Holds the number 100! uint64_t sum; //The sum of the digits of num public: + //Constructor Problem20(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the number 100! - mpz_class getNumber() const; - //Returns the number 100! in a string - std::string getNumberString() const; - //Returns the sum of the digits of 100! - uint64_t getSum() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + mpz_class getNumber() const; //Returns the number 100! + std::string getNumberString() const; //Returns the number 100! in a string + uint64_t getSum() const; //Returns the sum of the digits of 100! }; /* Results: 100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 The sum of the digits is: 648 -It took 8.300 microseconds to solve this problem. +It took an average of 4.094 microseconds to run this problem over 100 iterations */ #endif //PROBLEM20_HPP diff --git a/Headers/Problem21.hpp b/Headers/Problem21.hpp index 5aa3080..62bcd57 100644 --- a/Headers/Problem21.hpp +++ b/Headers/Problem21.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem21.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem21.hpp //Matthew Ellison // Created: 11-08-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Evaluate the sum of all the amicable numbers under 10000 //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -33,19 +33,25 @@ class Problem21 : public Problem{ private: + //Variables + //Static variables static int LIMIT; //The top number that will be evaluated + //Instance variables std::vector divisorSum; //Holds the sum of the divisors of the subscript number std::vector amicable; //Holds all amicable numbers - void reserveVectors(); + + //Functions + void reserveVectors(); //Reserve the size of the vector to speed up insertion public: + //Constructor Problem21(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns a vector with all of the amicable numbers calculated - std::vector getAmicable() const; - //Returns the sum of all of the amicable numbers - uint64_t getSum() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + std::vector getAmicable() const; //Returns a vector with all of the amicable numbers calculated + uint64_t getSum() const; //Returns the sum of all of the amicable numbers }; @@ -62,7 +68,7 @@ All amicable numbers less than 10000 are 6232 6368 The sum of all of these amicable numbers is 31626 -It took 4.083 milliseconds to solve this problem. +It took an average of 4.310 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM21_HPP diff --git a/Headers/Problem22.hpp b/Headers/Problem22.hpp index 62fc312..17c9b04 100644 --- a/Headers/Problem22.hpp +++ b/Headers/Problem22.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem22.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem22.hpp //Matthew Ellison // Created: 11-09-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the total of all the name scores in the file? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -33,24 +33,30 @@ class Problem22 : public Problem{ private: + //Variables + //Static variables + static std::vector names; //Holds the names that will be scored + //Instance variables std::vector sums; //Holds the score based on the sum of the characters in the name std::vector prod; //Holds the score based on the sum of the characters and the location in alphabetical order - static std::vector names; //Holds the names that will be scored - void reserveVectors(); + + //Functions + void reserveVectors(); //Reserve the size of the vector to speed up insertion public: + //Constructor Problem22(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the vector of the names being scored - std::vector getNames() const; - //Returns the sum of the names scores - uint64_t getNameScoreSum() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + std::vector getNames() const; //Returns the vector of the names being scored + uint64_t getNameScoreSum() const; //Returns the sum of the names scores }; /* Results: The answer to the question is 871198282 -It took 638.400 microseconds to solve this problem. +It took an average of 436.559 microseconds to run this problem over 100 iterations */ #endif //Problem22 diff --git a/Headers/Problem23.hpp b/Headers/Problem23.hpp index 9d46407..f38a939 100644 --- a/Headers/Problem23.hpp +++ b/Headers/Problem23.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem23.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem23.hpp //Matthew Ellison // Created: 11-09-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -33,24 +33,30 @@ class Problem23 : public Problem{ private: - static int MAX_NUM; + //Variable + //Static variables + static int MAX_NUM; //The largest possible number that can not be written as the sum of two abundant numbers + //Instance variables std::vector divisorSums; //This gives the sum of the divisors at subscripts uint64_t sum; //The sum of all the numbers we are looking for - //A function that returns true if num can be created by adding two elements from abund and false if it cannot - bool isSum(const std::vector& abund, int num); - void reserveVectors(); + + //Functions + bool isSum(const std::vector& abund, int num); //A function that returns true if num can be created by adding two elements from abund and false if it cannot + void reserveVectors(); //Reserve the size of the vector to speed up insertion public: + //Constructor Problem23(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the sum of the numbers asked for - uint64_t getSum() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + uint64_t getSum() const; //Returns the sum of the numbers asked for }; /* Results: The answer is 4179871 -It took 4.888 seconds to solve this problem. +It took an average of 5.902 seconds to run this problem over 100 iterations */ #endif //PROBLEM23_HPP diff --git a/Headers/Problem24.hpp b/Headers/Problem24.hpp index a183b21..f8a4186 100644 --- a/Headers/Problem24.hpp +++ b/Headers/Problem24.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem24.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem24.hpp //Matthew Ellison // Created: 11-11-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,23 +32,26 @@ class Problem24 : public Problem{ private: + //Variables + //Static variables static int NEEDED_PERM; //The number of the permutation that you need static std::string nums; //All of the characters that we need to get the permutations of + //Instance variables std::vector permutations; //Holds all of the permutations of the string nums public: + //Constructor Problem24(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns a vector with all of the permutations - std::vector getPermutationsList() const; - //Returns the specific permutations you are looking for - std::string getPermutation() const; + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + std::vector getPermutationsList() const; //Returns a vector with all of the permutations + std::string getPermutation() const; //Returns the specific permutations you are looking for }; /* Results The 1 millionth permutation is 2783915460 -It took 1.166 seconds to solve this problem. +It took an average of 1.157 seconds to run this problem over 100 iterations */ #endif //PROBLEM24_HPP diff --git a/Headers/Problem25.hpp b/Headers/Problem25.hpp index 52d36e8..837a4d9 100644 --- a/Headers/Problem25.hpp +++ b/Headers/Problem25.hpp @@ -1,14 +1,14 @@ -//ProjectEuler/C++/Headers/Problem25.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem25.hpp //Matthew Ellison // Created: 11-13-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the index of the first term in the Fibonacci sequence to contain 1000 digits? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses //This file contains a header from the gmp library. The library is used for large integers. //You can find more information about them at https://gmplib.org/ //When compiling this file you need to have the gmp library installed as well as linking the libraries to your executable using the -lgmpxx and -lgmp flags /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -35,14 +35,20 @@ class Problem25 : public Problem{ private: + //Variables + //Static variables static unsigned int NUM_DIGITS; //The number of digits to calculate up to + //Instance variables mpz_class number; //The current Fibonacci number mpz_class index; //The index of the current Fibonacci number just calculated public: + //Constructor Problem25(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem mpz_class getNumber() const; //Returns the Fibonacci number asked for std::string getNumberString() const; //Returns the Fibonacci number asked for as a string mpz_class getIndex() const; //Returns the index of the requested Fibonacci number @@ -53,7 +59,7 @@ public: /* Results: The first Fibonacci number with 1000 digits is 1070066266382758936764980584457396885083683896632151665013235203375314520604694040621889147582489792657804694888177591957484336466672569959512996030461262748092482186144069433051234774442750273781753087579391666192149259186759553966422837148943113074699503439547001985432609723067290192870526447243726117715821825548491120525013201478612965931381792235559657452039506137551467837543229119602129934048260706175397706847068202895486902666185435124521900369480641357447470911707619766945691070098024393439617474103736912503231365532164773697023167755051595173518460579954919410967778373229665796581646513903488154256310184224190259846088000110186255550245493937113651657039447629584714548523425950428582425306083544435428212611008992863795048006894330309773217834864543113205765659868456288616808718693835297350643986297640660000723562917905207051164077614812491885830945940566688339109350944456576357666151619317753792891661581327159616877487983821820492520348473874384736771934512787029218636250627816 Its index is 4782 -It took 188.246 milliseconds to solve this problem. +It took an average of 241.017 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM25_HPP diff --git a/Headers/Problem26.hpp b/Headers/Problem26.hpp index 4096b83..ff4a99c 100644 --- a/Headers/Problem26.hpp +++ b/Headers/Problem26.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem26.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem26.hpp //Matthew Ellison // Created: 07-28-19 -//Modified: 07-28-19 +//Modified: 07-09-20 //Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part. //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,14 +32,20 @@ class Problem26 : public Problem{ private: + //Variables + //Static variables static unsigned int TOP_NUMBER; //Holds the highest denominator we will check + //Instance variables unsigned int longestCycle; //The length of the longest cycle unsigned int longestNumber; //The starting denominator of the longest cycle public: + //Constructor Problem26(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem unsigned int getLongestCycle() const; //Returns the length of the longest cycle unsigned int getLongestNumber() const; //Returns the denominator that starts the longest cycle }; @@ -48,7 +54,7 @@ public: /* Results: The longest cycle is 982 digits long It is started with the number 983 -It took 6.865 milliseconds to solve this problem. +It took an average of 9.989 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM26_HPP diff --git a/Headers/Problem27.hpp b/Headers/Problem27.hpp index 47e0a96..999770b 100644 --- a/Headers/Problem27.hpp +++ b/Headers/Problem27.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem27.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem27.hpp //Matthew Ellison // Created: 09-14-19 -//Modified: 09-14-19 +//Modified: 07-09-20 //Find the product of the coefficients, |a| < 1000 and |b| <= 1000, for the quadratic expression that produces the maximum number of primes for consecutive values of n, starting with n=0. //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -33,25 +33,30 @@ class Problem27 : public Problem{ private: + //Variables + //Instance variables int64_t topA; //The A for the most n's generated int64_t topB; //The B for the most n's generated int64_t topN; //The most n's generated std::vector primes; //A list of all primes that could possibly be generated with this formula public: + //Constructor Problem27(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - int64_t getTopA() const; - int64_t getTopB() const; - int64_t getTopN() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + int64_t getTopA() const; //Returns the top A that was generated + int64_t getTopB() const; //Returns the top B that was generated + int64_t getTopN() const; //Returns the top N that was generated }; /* Results: The greatest number of primes found is 70 It was found with A = -61, B = 971 The product of A and B is -59231 -It took 2.076 seconds to solve this problem. +It took an average of 2.176 seconds to run this problem over 100 iterations */ #endif //PROBLEM27_HPP diff --git a/Headers/Problem28.hpp b/Headers/Problem28.hpp index e3c2a56..d288faf 100644 --- a/Headers/Problem28.hpp +++ b/Headers/Problem28.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem28.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem28.hpp //Matthew Ellison // Created: 09-21-19 -//Modified: 09-21-19 +//Modified: 07-09-20 //What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed by starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -34,23 +34,30 @@ class Problem28 : public Problem{ private: - std::vector> grid; //Holds the grid that we will be filling and searching + //Variables + //Instance variables + std::vector> grid; //Holds the grid that we will be filling and searching uint64_t sumOfDiagonals; //Holds the sum of the diagonals of the grid + + //Functions void setupGrid(); //This sets up the grid to hold the correct number of variables void createGrid(); //Puts all of the numbers in the grid up the grid void findSum(); //Finds the sum of the diagonals in the grid public: + //Constructor Problem28(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - std::vector> getGrid() const; //Returns the grid + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + std::vector> getGrid() const; //Returns the grid uint64_t getSum() const; //Returns the sum of the diagonals }; /* Results: The sum of the diagonals in the given grid is 669171001 -It took 913.800 microseconds to solve this problem. +It took an average of 1.254 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM28_HPP diff --git a/Headers/Problem29.hpp b/Headers/Problem29.hpp index f8aa342..1df5d6d 100644 --- a/Headers/Problem29.hpp +++ b/Headers/Problem29.hpp @@ -1,14 +1,14 @@ -//ProjectEuler/C++/Headers/Problem29.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem29.hpp //Matthew Ellison // Created: 10-06-19 -//Modified: 10-06-19 +//Modified: 07-09-20 //How many distinct terms are in the sequence generated by a^b for 2 <= a <= 100 and 2 <= b <= 100? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses //This file contains a header from the gmp library. The library is used for large integers. //You can find more information about them at https://gmplib.org/ //When compiling this file you need to have the gmp library installed as well as linking the libraries to your executable using the -lgmpxx and -lgmp flags /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -38,26 +38,32 @@ class Problem29 : public Problem{ private: - static const unsigned int BOTTOM_A = 2; //The lowest possible value for a - static const unsigned int TOP_A = 100; //The highest possible value for a - static const unsigned int BOTTOM_B = 2; //The lowest possible value for b - static const unsigned int TOP_B = 100; //The highest possible value for b + //Variables + //Static variables + static unsigned int BOTTOM_A; //The lowest possible value for a + static unsigned int TOP_A; //The highest possible value for a + static unsigned int BOTTOM_B; //The lowest possible value for b + static unsigned int TOP_B; //The highest possible value for b + //Instance variables std::vector unique; //Holds all values in powers, except repeats public: + //Constructor Problem29(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - unsigned int getBottomA() const; - unsigned int getTopA() const; - unsigned int getBottomB() const; - unsigned int getTopB() const; - std::vector getUnique() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + unsigned int getBottomA() const; //Returns the lowest possible value for a + unsigned int getTopA() const; //Returns the highest possible value for a + unsigned int getBottomB() const; //Returns the lowest possible value for b + unsigned int getTopB() const; //Returns the highest possible value for b + std::vector getUnique() const; //Returns a vector of all the unique values for a^b }; /* Results: The number of unique values generated by a^b for 2 <= a <= 100 and 2 <= b <= 100 is 9183 -It took 1.464 seconds to solve this problem. +It took an average of 1.651 seconds to run this problem over 100 iterations */ #endif //PROBLEM29_HPP diff --git a/Headers/Problem3.hpp b/Headers/Problem3.hpp index 275b2a5..ebce77e 100644 --- a/Headers/Problem3.hpp +++ b/Headers/Problem3.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem3.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem3.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //The largest prime factor of 600851475143 //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -33,24 +33,27 @@ class Problem3 : public Problem{ private: - static uint64_t GOAL_NUMBER; //The number you are trying to find the factors of + //Variables + //Static variables + static uint64_t GOAL_NUMBER; //The number of which you are trying to find the factors + //Instance variables std::vector factors; //Holds the factors of goalNumber public: + //Constructor Problem3(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the list of factors of the number - std::vector getFactors() const; - //Returns the largest factor of the number - uint64_t getLargestFactor() const; - //Returns the number - uint64_t getGoalNumber() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + std::vector getFactors() const; //Returns the list of factors of the number + uint64_t getLargestFactor() const; //Returns the largest factor of the number + uint64_t getGoalNumber() const; //Returns the number }; /* Results: The largest factor of the number 600851475143 is 6857 -It took 46.738 milliseconds to solve this problem. +It took an average of 50.300 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM3_HPP diff --git a/Headers/Problem30.hpp b/Headers/Problem30.hpp index a36dcd5..827ae27 100644 --- a/Headers/Problem30.hpp +++ b/Headers/Problem30.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem30.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem30.hpp //Matthew Ellison // Created: 10-27-19 -//Modified: 10-27-19 +//Modified: 07-09-20 //Find the sum of all the numbers that can be written as the sum of the fifth powers of their digits. //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -33,16 +33,24 @@ class Problem30 : public Problem{ private: - static const uint64_t TOP_NUM = 1000000; //This is the largest number that will be checked - static const uint64_t BOTTOM_NUM = 2; //Start with 2 because 0 and 1 don't count - static const uint64_t POWER_RAISED = 5; //This is the power that the digits are raised to + //Variables + //Static variables + static uint64_t TOP_NUM; //This is the largest number that will be checked + static uint64_t BOTTOM_NUM; //Start with 2 because 0 and 1 don't count + static uint64_t POWER_RAISED; //This is the power that the digits are raised to + //Instance variables std::vector sumOfFifthNumbers; //This is a vector of the numbers that are the sum of the fifth power of their digits + + //Functions std::vector getDigits(uint64_t num); //Returns a vector with the indivitual digits of the number passed into it public: + //Constructor Problem30(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem uint64_t getTopNum() const; //This returns the top number to be checked std::vector getListOfSumOfFifths() const; //This returns a copy of the vector holding all the numbers that are the sum of the fifth power of their digits uint64_t getSumOfList() const; //This returns the sum of all entries in sumOfFifthNumbers @@ -51,7 +59,7 @@ public: /* Results: The sum of all the numbers that can be written as the sum of the fifth powers of their digits is 443839 -It took 280.300 milliseconds to solve this problem. +It took an average of 306.944 milliseconds to run this problem over 100 iterations */ diff --git a/Headers/Problem31.hpp b/Headers/Problem31.hpp index 4a4d988..ddb164a 100644 --- a/Headers/Problem31.hpp +++ b/Headers/Problem31.hpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Headers/Problem31.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem31.hpp //Matthew Ellison // Created: 06-19-20 -//Modified: 06-19-20 +//Modified: 07-09-20 //How many different ways can £2 be made using any number of coins? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* @@ -32,21 +32,26 @@ class Problem31 : public Problem{ private: - static int desiredValue; - int permutations; + //Variables + //Static variables + static int desiredValue; //The value of coins we want + //Instance variables + int permutations; //The number of permutations that are found public: + //Constructor Problem31(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the number of correct permutations of the coins - int getPermutations() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + int getPermutations() const; //Returns the number of correct permutations of the coins }; /* Results: There are 73682 ways to make 2 pounds with the given denominations of coins -It took 0.000 nanoseconds to solve this problem. +It took an average of 1.916 microseconds to run this problem over 100 iterations */ diff --git a/Headers/Problem4.hpp b/Headers/Problem4.hpp index ee4e1ad..5a90898 100644 --- a/Headers/Problem4.hpp +++ b/Headers/Problem4.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem4.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem4.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the largest palindrome made from the product of two 3-digit numbers //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,24 +32,28 @@ class Problem4 : public Problem{ private: - static int START_NUM; - static int END_NUM; + //Variables + //Static variables + static int START_NUM; //The first number to check + static int END_NUM; //The last number to check + //Instance variables std::vector palindromes; //Holds all numbers that turn out to be palindromes public: + //Constructor Problem4(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the list of all palindromes - std::vector getPalindromes() const; - //Returns the largest palindrome - uint64_t getLargestPalindrome() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + std::vector getPalindromes() const; //Returns the list of all palindromes + uint64_t getLargestPalindrome() const; //Returns the largest palindrome }; /* Results: The largest palindrome is 906609 -It took 31.904 milliseconds to solve this problem. +It took an average of 36.525 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM4_HPP diff --git a/Headers/Problem5.hpp b/Headers/Problem5.hpp index a27a415..019c8d4 100644 --- a/Headers/Problem5.hpp +++ b/Headers/Problem5.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem5.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem5.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -33,19 +33,23 @@ class Problem5 : public Problem{ private: - int smallestNum; + //Variables + //Instance variables + int smallestNum; //The smallest number that is found public: + //Constructor Problem5(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the requested number - int getNumber() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + int getNumber() const; //Returns the requested number }; /* Results: The smallest positive number evenly divisible by all numbers 1-20 is 232792560 -It took 748.245 milliseconds to run this algorithm +It took an average of 1.928 seconds to run this problem over 100 iterations */ #endif //PROBLEM5_HPP diff --git a/Headers/Problem6.hpp b/Headers/Problem6.hpp index 0e9d2c5..d5e7145 100644 --- a/Headers/Problem6.hpp +++ b/Headers/Problem6.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem6.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem6.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum. //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,26 +32,29 @@ class Problem6 : public Problem{ private: - static int START_NUM; - static int END_NUM; + //Variables + //Static variables + static int START_NUM; //The first number to check + static int END_NUM; //The last number to check + //Instance variables uint64_t sumOfSquares; //Holds the sum of the squares of all the numbers uint64_t squareOfSum; //Holds the square of the sum of all the numbers public: + //Constructor Problem6(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the sum of all the squares - uint64_t getSumOfSquares() const; - //Returns the square of all of the sums - uint64_t getSquareOfSum() const; - //Returns the requested difference - uint64_t getDifference() const; + //Operational functinos + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + uint64_t getSumOfSquares() const; //Returns the sum of all the squares + uint64_t getSquareOfSum() const; //Returns the square of all of the sums + uint64_t getDifference() const; //Returns the requested difference }; /* Result The difference between the sum of the squares and the square of the sum of all numbers from 1-100 is 25164150 -It took 1.000 microseconds to solve this problem. +It took an average of 76.000 nanoseconds to run this problem over 100 iterations */ #endif //PROBLEM6_HPP diff --git a/Headers/Problem67.hpp b/Headers/Problem67.hpp index 4602255..dbed840 100644 --- a/Headers/Problem67.hpp +++ b/Headers/Problem67.hpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Headers/Problem67.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem67.hpp //Matthew Ellison // Created: 11-02-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //The way to do this is using a breadth first search /* Find the maximum total from top to bottom @@ -108,7 +108,7 @@ Find the maximum total from top to bottom */ //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -136,6 +136,7 @@ Find the maximum total from top to bottom class Problem67 : public Problem{ private: + //Structures struct location{ int xLocation; int yLocation; @@ -143,18 +144,25 @@ private: bool fromRight; location(int x, int y, int t, bool r) : xLocation(x), yLocation(y), total(t), fromRight(r){ } }; - void invert(); //This function takes every number in the vector and changes it to 100 - the number + //Variables + //Static variables static const int NUM_ROWS = 100; //The number of rows in the list of numbers + static std::vector list[NUM_ROWS]; //This is the list you are trying to find a path through + //Instance variables std::list foundPoints; //For the points that I have already found the shortest distance to std::list possiblePoints; //For the locations you are checking this round int actualTotal; //The true total of the path from the top to the bottom - //This is the list you are trying to find a path through - static std::vector list[NUM_ROWS]; + + //Functions + void invert(); //This function takes every number in the vector and changes it to 100 - the number public: + //Constructor Problem67(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem std::string getPyramid() const; //Returns the pyramid that was traversed as a string std::string getTrail(); //Returns the trail the algorithm took as a string int getTotal() const; //Returns the total that was asked for @@ -162,7 +170,7 @@ public: /* Results: The value of the longest path is 7273 -It took 208.728 milliseconds to solve this problem. +It took an average of 366.373 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM67_HPP diff --git a/Headers/Problem7.hpp b/Headers/Problem7.hpp index 620a4ee..4ebe74c 100644 --- a/Headers/Problem7.hpp +++ b/Headers/Problem7.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem7.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem7.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the 10001th prime number? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -33,20 +33,25 @@ class Problem7: public Problem{ private: - static uint64_t NUMBER_OF_PRIMES; + //Variables + //Static variables + static uint64_t NUMBER_OF_PRIMES; //The index of the prime number to find + //Instance variables std::vector primes; //Holds the prime numbers public: + //Constructor Problem7(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the requested prime number - uint64_t getPrime() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + uint64_t getPrime() const; //Returns the requested prime number }; /* Results The 10001th prime number is 104743 -It took 3.551 milliseconds to solve this problem. +It took an average of 3.864 milliseconds to run this problem over 100 iterations */ #endif //PROBLEM7_HPP diff --git a/Headers/Problem8.hpp b/Headers/Problem8.hpp index 51e5fc0..ce4732e 100644 --- a/Headers/Problem8.hpp +++ b/Headers/Problem8.hpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Headers/Problem8.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem8.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product? /* 73167176531330624919225119674426574742355349194934 @@ -27,7 +27,7 @@ */ //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -55,25 +55,29 @@ class Problem8 : public Problem{ private: - static std::string number; + //Variables + //Static variables + static std::string number; //The number that we are working with + //Instance variables std::string maxNums; //Holds the string of the largest product uint64_t maxProduct; //Holds the largest product of 13 numbers public: + //Constructor Problem8(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the string of numbers that produces the largest product - std::string getLargestNums() const; - //Returns the requested product - uint64_t getLargestProduct() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + std::string getLargestNums() const; //Returns the string of numbers that produces the largest product + uint64_t getLargestProduct() const; //Returns the requested product }; /* Results The greatest product is 23514624000 The numbers are 5576689664895 -It took 124.900 microseconds to solve this problem. +It took an average of 129.024 microseconds to run this problem over 100 iterations */ #endif //PROBLEM8_HPP diff --git a/Headers/Problem9.hpp b/Headers/Problem9.hpp index 755403f..b00cd24 100644 --- a/Headers/Problem9.hpp +++ b/Headers/Problem9.hpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem9.hpp +//ProjectEuler/ProjectEulerCPP/Headers/Problem9.hpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //There exists exactly one Pythagorean triplet for which a + b + c = 1000. Find the product of abc. //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,29 +32,30 @@ class Problem9 : public Problem{ private: - int a; //Holds the position on the first side - int b; //Holds the position on the second side + //Variables + //Instance variables + int a; //Holds the position on the first side + int b; //Holds the position on the second side double c; //Holds the hyp bool found; //A flag to determine if we have found the solution yet public: + //Constructor Problem9(); - virtual void solve(); - virtual std::string getString() const; - virtual void reset(); - //Returns the length of the first side - int getSideA() const; - //Returns the length of the second side - int getSideB() const; - //Returns the length of the hyp - int getSideC() const; - //Returns the product of the 3 sides - int getProduct() const; + //Operational functions + virtual void solve(); //Solve the problem + virtual void reset(); //Reset the problem so it can be run again + //Gets + virtual std::string getString() const; //Return a string with the solution to the problem + int getSideA() const; //Returns the length of the first side + int getSideB() const; //Returns the length of the second side + int getSideC() const; //Returns the length of the hyp + int getProduct() const; //Returns the product of the 3 sides }; /* Results: The Pythagorean triplet is 200 375 425 The numbers' product is 31875000 -It took 0.000 nanoseconds to solve this problem. +It took an average of 154.595 microseconds to run this problem over 100 iterations */ #endif //PROBLEM9_HPP diff --git a/Source/Problem1.cpp b/Source/Problem1.cpp index ca3c1b5..1175586 100644 --- a/Source/Problem1.cpp +++ b/Source/Problem1.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem1.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem1.cpp //Matthew Ellison // Created: 07-10-19 -//Modified: 07-10-19 +//Modified: 07-09-20 //What is the sum of all the multiples of 3 or 5 that are less than 1000 //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -31,11 +31,15 @@ #include "../Headers/Problem1.hpp" -uint64_t Problem1::MAX_NUMBER = 1000; +//The highest number to be tested +uint64_t Problem1::MAX_NUMBER = 999; +//Constructor Problem1::Problem1() : Problem("What is the sum of all the multiples of 3 or 5 that are less than 1000?"), fullSum(0){ } +//Operational functions +//Solve the problem void Problem1::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -45,8 +49,8 @@ void Problem1::solve(){ timer.start(); //Step through every number < 1000 and see if either 3 or 5 divide it evenly - for(uint64_t cnt = 1;cnt < MAX_NUMBER;++cnt){ - //If either divides it then add it to the vector + for(uint64_t cnt = 1;cnt <= MAX_NUMBER;++cnt){ + //If either 3 or 5 divides it evenly then add it to the vector if((cnt % 3) == 0){ numbers.push_back(cnt); } @@ -67,25 +71,31 @@ void Problem1::solve(){ solved = true; } -std::string Problem1::getString() const{ - //If the problem hasn't been solved throw an exception - if(!solved){ - throw unsolved(); - } - std::stringstream results; - results << "The sum of all the numbers < 1000 that are divisible by 3 or 5 is " << fullSum; - return results.str(); -} - -uint64_t Problem1::getSum() const{ - if(!solved){ - throw unsolved(); - } - return fullSum; -} - +//Reset the problem so it can be run again void Problem1::reset(){ Problem::reset(); fullSum = 0; numbers.clear(); } + + +//Gets +//Return a string with the solution to the problem +std::string Problem1::getString() const{ + //If the problem hasn't been solved throw an exception + if(!solved){ + throw unsolved(); + } + //Create a string with the results and return it + std::stringstream results; + results << "The sum of all the numbers < " << MAX_NUMBER + 1 << " that are divisible by 3 or 5 is " << fullSum; + return results.str(); +} + +uint64_t Problem1::getSum() const{ + //If the prblem hasn't been solved throw an exception + if(!solved){ + throw unsolved(); + } + return fullSum; +} diff --git a/Source/Problem10.cpp b/Source/Problem10.cpp index 0dbdbc7..3b4ccfb 100644 --- a/Source/Problem10.cpp +++ b/Source/Problem10.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem10.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem10.cpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the sum of all the primes below two million //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -31,11 +31,13 @@ #include "../Headers/Problem10.hpp" -uint64_t Problem10::GOAL_NUMBER = 2000000; +uint64_t Problem10::GOAL_NUMBER = 2000000 - 1; //2,000,000 - 1 because is needs to be < instead of <= +//Constructor Problem10::Problem10() : Problem("Find the sum of all the primes below two million"), sum(0){ } +//Solve void Problem10::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -44,8 +46,8 @@ void Problem10::solve(){ //Start the timer timer.start(); - //Get the sum of all prime numbers < GOAL_NUMBER - sum = mee::getSum(mee::getPrimes(GOAL_NUMBER - 1)); //Subtract 1 because it is supposed to be < 2000000 + //Get the sum of all prime numbers <= GOAL_NUMBER + sum = mee::getSum(mee::getPrimes(GOAL_NUMBER)); //Stop the timer timer.stop(); @@ -54,16 +56,24 @@ void Problem10::solve(){ solved = true; } +//Reset the rpoblem so it can be run agian +void Problem10::reset(){ + Problem::reset(); + sum = 0; +} + +//Return a string with the solution to the problem std::string Problem10::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ throw unsolved(); } std::stringstream results; - results << "The sum of all the primes less than " << GOAL_NUMBER << " is " << sum; + results << "The sum of all the primes less than " << GOAL_NUMBER + 1 << " is " << sum; return results.str(); } +//Returns the sum that was requested uint64_t Problem10::getSum() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -71,8 +81,3 @@ uint64_t Problem10::getSum() const{ } return sum; } - -void Problem10::reset(){ - Problem::reset(); - sum = 0; -} diff --git a/Source/Problem11.cpp b/Source/Problem11.cpp index 77ace06..9d47660 100644 --- a/Source/Problem11.cpp +++ b/Source/Problem11.cpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Source/Problem11.cpp -//MatthewEllison +//ProjectEuler/ProjectEulerCPP/Source/Problem11.cpp +//Matthew Ellison // Created: 09-29-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid? /* 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 @@ -27,7 +27,7 @@ */ //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -53,6 +53,7 @@ #include "../Headers/Problem11.hpp" +//This is the grid of number that we will be working with std::vector Problem11::grid[20] = {{ 8, 02, 22, 97, 38, 15, 00, 40, 00, 75, 04, 05, 07, 78, 52, 12, 50, 77, 91, 8}, {49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 04, 56, 62, 00}, {81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 03, 49, 13, 36, 65}, @@ -74,9 +75,11 @@ std::vector Problem11::grid[20] = {{ 8, 02, 22, 97, 38, 15, 00, 40, 00, 75, {20, 73, 35, 29, 78, 31, 90, 01, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 05, 54}, {01, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 01, 89, 19, 67, 48}}; +//Constructor Problem11::Problem11() : Problem("What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20x20 grid?"){ } +//Solve the problem void Problem11::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -175,6 +178,13 @@ void Problem11::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem11::reset(){ + Problem::reset(); + greatestProduct.clear(); +} + +//Return a string with the solution to the problem std::string Problem11::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -186,6 +196,7 @@ std::string Problem11::getString() const{ return results.str(); } +//Returns the numbers that were being searched std::vector Problem11::getNumbers() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -194,6 +205,7 @@ std::vector Problem11::getNumbers() const{ return greatestProduct; } +//Returns the product that was requested int Problem11::getProduct() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -201,8 +213,3 @@ int Problem11::getProduct() const{ } return mee::getProduct(greatestProduct); } - -void Problem11::reset(){ - Problem::reset(); - greatestProduct.clear(); -} diff --git a/Source/Problem12.cpp b/Source/Problem12.cpp index b398319..21b8577 100644 --- a/Source/Problem12.cpp +++ b/Source/Problem12.cpp @@ -1,10 +1,10 @@ -//ProjectEuler/C++/Source/Problem12.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem12.cpp //Matthew Ellison // Created: 09-27-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the value of the first triangle number to have over five hundred divisors? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses -/* Copyright (C) 2019 Matthew Ellison +/* Copyright (C) 2020 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 @@ -30,11 +30,14 @@ #include "../Headers/Problem12.hpp" +//The number of divisors that you want uint64_t Problem12::GOAL_DIVISORS = 500; +//Constructor Problem12::Problem12() : Problem("What is the value of the first triangle number to have over five hundred divisors?"), sum(1), counter(2){ } +//Solve the problem void Problem12::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -67,6 +70,15 @@ void Problem12::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem12::reset(){ + Problem::reset(); + divisors.clear(); + sum = 1; + counter = 2; +} + +//Return a string with the solution to the problem std::string Problem12::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -77,6 +89,7 @@ std::string Problem12::getString() const{ return results.str(); } +//Returns the triangular number int64_t Problem12::getTriangularNumber() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -85,6 +98,7 @@ int64_t Problem12::getTriangularNumber() const{ return sum; } +//Get the final number that was added to the triangular number int64_t Problem12::getLastNumberAdded() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -93,6 +107,7 @@ int64_t Problem12::getLastNumberAdded() const{ return counter - 1; } +//Returns the list of divisors of the requested number std::vector Problem12::getDivisorsOfTriangularNumber() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -101,6 +116,7 @@ std::vector Problem12::getDivisorsOfTriangularNumber() const{ return divisors; } +//Returns the number of divisors of the requested number size_t Problem12::getNumberOfDivisors() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -108,10 +124,3 @@ size_t Problem12::getNumberOfDivisors() const{ } return divisors.size(); } - -void Problem12::reset(){ - Problem::reset(); - divisors.clear(); - sum = 1; - counter = 2; -} diff --git a/Source/Problem13.cpp b/Source/Problem13.cpp index 8393b46..4cd016c 100644 --- a/Source/Problem13.cpp +++ b/Source/Problem13.cpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Source/Problem13.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem13.cpp //Matthew Ellison // Created: 09-29-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Work out the first ten digits of the sum of the following one-hundred 50-digit numbers /* 37107287533902102798797998220837590246510135740250 @@ -110,7 +110,7 @@ //You can find more information about them at https://gmplib.org/ //When compiling this file you need to have the gmp library installed as well as linking the libraries to your executable using the -lgmpxx and -lgmp flags /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -138,16 +138,7 @@ #include "../Headers/Problem13.hpp" -Problem13::Problem13() : Problem("Work out the first ten digits of the sum of the one-hundred 50-digit numbers"), sum(0){ - reserveVectors(); -} - -void Problem13::reserveVectors(){ - //Make sure the vector is the correct size - nums.reserve(100); - nums.resize(100); -} - +//A function to set the nums vector void Problem13::setNums(){ //Set the numbers nums[0] = "37107287533902102798797998220837590246510135740250"; @@ -252,6 +243,19 @@ void Problem13::setNums(){ nums[99] = "53503534226472524250874054075591789781264330331690"; } +//Reserve the size of the vector to speed up insertion +void Problem13::reserveVectors(){ + //Make sure the vector is the correct size + nums.reserve(100); + nums.resize(100); +} + +//Constructor +Problem13::Problem13() : Problem("Work out the first ten digits of the sum of the one-hundred 50-digit numbers"), sum(0){ + reserveVectors(); +} + +//Solve the problem void Problem13::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -274,6 +278,15 @@ void Problem13::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem13::reset(){ + Problem::reset(); + sum = 0; + nums.clear(); + reserveVectors(); +} + +//Return a string with the solution to the problem std::string Problem13::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -286,6 +299,7 @@ std::string Problem13::getString() const{ return results.str(); } +//Returns the list 50-digit numbers std::vector Problem13::getNumbers() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -294,6 +308,7 @@ std::vector Problem13::getNumbers() const{ return nums; } +//Returns the sum of the 50-digit numbers mpz_class Problem13::getSum() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -301,10 +316,3 @@ mpz_class Problem13::getSum() const{ } return sum; } - -void Problem13::reset(){ - Problem::reset(); - sum = 0; - nums.clear(); - reserveVectors(); -} diff --git a/Source/Problem14.cpp b/Source/Problem14.cpp index 3446ee3..dcf6766 100644 --- a/Source/Problem14.cpp +++ b/Source/Problem14.cpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Source/Problem14.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem14.cpp //Matthew Ellison // Created: 09-29-18 -//Modified: 07-14-19 +//Modified: 07-09-20 /* The following iterative sequence is defined for the set of positive integers: n → n/2 (n is even) @@ -10,7 +10,7 @@ Which starting number, under one million, produces the longest chain? */ //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -35,8 +35,10 @@ Which starting number, under one million, produces the longest chain? #include "../Headers/Problem14.hpp" -uint64_t Problem14::MAX_NUM = 1000000; +//This is the top number that you will be checking against the series +uint64_t Problem14::MAX_NUM = 999999; +//This function follows the rules of the sequence and returns its length uint64_t Problem14::checkSeries(uint64_t num){ uint64_t length = 1; //Start at 1 because you need to count the starting number @@ -53,9 +55,11 @@ uint64_t Problem14::checkSeries(uint64_t num){ return length; } +//Constructor Problem14::Problem14() : Problem("Which starting number, under one million, produces the longest chain using the itterative sequence?"), maxLength(0), maxNum(0){ } +//Solve the problem void Problem14::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -66,7 +70,7 @@ void Problem14::solve(){ timer.start(); //Loop through all numbers less than 1000000 and check them agains the series - for(uint64_t currentNum = 1;currentNum < MAX_NUM;++currentNum){ + for(uint64_t currentNum = 1;currentNum <= MAX_NUM;++currentNum){ uint64_t currentLength = checkSeries(currentNum); //If the current number has a longer series than the max then the current becomes the max if(currentLength > maxLength){ @@ -82,6 +86,14 @@ void Problem14::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem14::reset(){ + Problem::reset(); + maxLength = 0; + maxNum = 0; +} + +//Return a string with the solution to the problem std::string Problem14::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -93,6 +105,7 @@ std::string Problem14::getString() const{ return results.str(); } +//Returns the length of the requested chain uint64_t Problem14::getLength() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -101,6 +114,7 @@ uint64_t Problem14::getLength() const{ return maxLength; } +//Returns the starting number of the requested chain uint64_t Problem14::getStartingNumber() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -108,9 +122,3 @@ uint64_t Problem14::getStartingNumber() const{ } return maxNum; } - -void Problem14::reset(){ - Problem::reset(); - maxLength = 0; - maxNum = 0; -} diff --git a/Source/Problem15.cpp b/Source/Problem15.cpp index 1a1908e..387de2c 100644 --- a/Source/Problem15.cpp +++ b/Source/Problem15.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem15.hpp +//ProjectEuler/ProjectEulerCPP/Source/Problem15.hpp //Matthew Ellison // Created: 09-29-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //How many routes from the top left corner to the bottom right corner are there through a 20×20 grid if you can only move right and down? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -30,9 +30,11 @@ #include "../Headers/Problem15.hpp" -int Problem15::WIDTH = 20; -int Problem15::LENGTH = 20; +int Problem15::WIDTH = 20; //The width of the grid +int Problem15::LENGTH = 20; //The length of the grid +//This function acts as a handler for moving the position on the grid and counting the distance +//It moves right first, then down void Problem15::move(int currentX, int currentY, uint64_t& numOfRoutes){ //Check if you are at the end if((currentX == WIDTH) && (currentY == LENGTH)){ @@ -51,9 +53,11 @@ void Problem15::move(int currentX, int currentY, uint64_t& numOfRoutes){ } } +//Constructor Problem15::Problem15() : Problem("How many routes from the top left corner to the bottom right corner are there through a 20×20 grid if you can only move right and down?"), numOfRoutes(0){ } +//Solve the problem void Problem15::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -78,6 +82,13 @@ void Problem15::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem15::reset(){ + Problem::reset(); + numOfRoutes = 0; +} + +//Return a string with the solution to the problem std::string Problem15::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -89,6 +100,7 @@ std::string Problem15::getString() const{ return results.str(); } +//Returns the number of routes found uint64_t Problem15::getNumberOfRoutes() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -96,8 +108,3 @@ uint64_t Problem15::getNumberOfRoutes() const{ } return numOfRoutes; } - -void Problem15::reset(){ - Problem::reset(); - numOfRoutes = 0; -} diff --git a/Source/Problem16.cpp b/Source/Problem16.cpp index fff8ca8..47ebcbf 100644 --- a/Source/Problem16.cpp +++ b/Source/Problem16.cpp @@ -1,14 +1,14 @@ -//ProjectEuler/C++/Source/Problem16.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem16.cpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the sum of the digits of the number 2^1000? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses //This file contains a header from the gmp library. The library is used for large integers. //You can find more information about them at https://gmplib.org/ //When compiling this file you need to have the gmp library installed as well as linking the libraries to your executable using the -lgmpxx and -lgmp flags /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -35,9 +35,11 @@ int Problem16::NUM_TO_POWER = 2; //The number that is going to be raised to a power int Problem16::POWER = 1000; //The power that the number is going to be raised to +//Constructor Problem16::Problem16() : Problem("What is the sum of the digits of the number 2^1000?"), num(0), sumOfElements(0){ } +//Solve the problem void Problem16::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -67,6 +69,15 @@ void Problem16::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem16::reset(){ + Problem::reset(); + num = 0; + sumOfElements = 0; +} + + +//Return a string with the solution to the problem std::string Problem16::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -79,6 +90,7 @@ std::string Problem16::getString() const{ return results.str(); } +//Returns the number that was calculated mpz_class Problem16::getNumber() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -87,6 +99,7 @@ mpz_class Problem16::getNumber() const{ return num; } +//Return the sum of the digits of the number int Problem16::getSum() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -94,9 +107,3 @@ int Problem16::getSum() const{ } return sumOfElements; } - -void Problem16::reset(){ - Problem::reset(); - num = 0; - sumOfElements = 0; -} diff --git a/Source/Problem17.cpp b/Source/Problem17.cpp index aac5c7a..7b7f15f 100644 --- a/Source/Problem17.cpp +++ b/Source/Problem17.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem17.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem17.cpp //Matthew Ellison // Created: 10-05-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -30,11 +30,10 @@ #include "../Headers/Problem17.hpp" +//This is the largest number to get the words of int Problem17::TOP_NUM = 1000; -Problem17::Problem17() : Problem("If all the numbers from 1 to 1000 inclusive were written out in words, how many letters would be used?"), letterCount(0){ -} - +//This function makes a word out of the number passed into it std::string Problem17::makeWord(int num){ int currentDivider = 1000; int currentNum; @@ -142,6 +141,7 @@ std::string Problem17::makeWord(int num){ return word; } +//This function helps makeWord() by returning the words for the numbers 1-9 std::string Problem17::wordHelper(int num){ std::string tempString; switch(num){ @@ -159,6 +159,7 @@ std::string Problem17::wordHelper(int num){ return tempString; } +//This counts the number of letters in the string that is passed in (ignoring numbers and punctuation) uint64_t Problem17::countLetters(std::string str){ uint64_t letterCount = 0; //Step through every character in the string and count how many letters there are @@ -170,6 +171,11 @@ uint64_t Problem17::countLetters(std::string str){ return letterCount; } +//Constructor +Problem17::Problem17() : Problem("If all the numbers from 1 to 1000 inclusive were written out in words, how many letters would be used?"), letterCount(0){ +} + +//Solve the problem void Problem17::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -192,6 +198,13 @@ void Problem17::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem17::reset(){ + Problem::reset(); + letterCount = 0; +} + +//Return a string with the solution to the problem std::string Problem17::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -202,6 +215,7 @@ std::string Problem17::getString() const{ return results.str(); } +//Returns the number of letters asked for uint64_t Problem17::getLetterCount() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -209,8 +223,3 @@ uint64_t Problem17::getLetterCount() const{ } return letterCount; } - -void Problem17::reset(){ - Problem::reset(); - letterCount = 0; -} diff --git a/Source/Problem18.cpp b/Source/Problem18.cpp index b4f053a..8175ff0 100644 --- a/Source/Problem18.cpp +++ b/Source/Problem18.cpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Source/Problem18.hpp +//ProjectEuler/ProjectEulerCPP/Source/Problem18.hpp //Matthew Ellison // Created: 11-01-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the maximum total from top to bottom /* 75 @@ -23,7 +23,7 @@ //This is done using a breadth first search //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -48,6 +48,7 @@ #include "../Headers/Problem18.hpp" +//Setup the list you are trying to find a path through std::vector Problem18::list[NUM_ROWS] = {{75}, {95, 64}, @@ -65,9 +66,7 @@ std::vector Problem18::list[NUM_ROWS] = {63, 66, 04, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31}, {04, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 04, 23}}; -Problem18::Problem18() : Problem("Find the maximum total from the top to the bottom of the pyramid."), actualTotal(0){ -} - +//This list turns every number in the vector into 100 - num void Problem18::invert(){ for(unsigned int rowCnt = 0;rowCnt < NUM_ROWS;++rowCnt){ for(unsigned int colCnt = 0;colCnt < list[rowCnt].size();++colCnt){ @@ -76,6 +75,11 @@ void Problem18::invert(){ } } +//Constructor +Problem18::Problem18() : Problem("Find the maximum total from the top to the bottom of the pyramid."), actualTotal(0){ +} + +//Solve the problem void Problem18::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -135,6 +139,15 @@ void Problem18::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem18::reset(){ + Problem::reset(); + foundPoints.clear(); + possiblePoints.clear(); + actualTotal = 0; +} + +//Return a string with the solution to the problem std::string Problem18::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -146,6 +159,7 @@ std::string Problem18::getString() const{ return results.str(); } +//Returns the pyramid that was traversed as a string std::string Problem18::getPyramid(){ //If the problem hasn't been solved throw an exception if(!solved){ @@ -162,6 +176,7 @@ std::string Problem18::getPyramid(){ return results.str(); } +//Returns the trail the algorithm took as a string std::string Problem18::getTrail(){ //If the problem hasn't been solved throw an exception if(!solved){ @@ -218,6 +233,7 @@ std::string Problem18::getTrail(){ return results.str(); } +//Returns the total that was asked for int Problem18::getTotal() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -225,10 +241,3 @@ int Problem18::getTotal() const{ } return actualTotal; } - -void Problem18::reset(){ - Problem::reset(); - foundPoints.clear(); - possiblePoints.clear(); - actualTotal = 0; -} diff --git a/Source/Problem19.cpp b/Source/Problem19.cpp index 085aaf3..e4e1210 100644 --- a/Source/Problem19.cpp +++ b/Source/Problem19.cpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Source/Problem19.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem19.cpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)? /* You are given the following information, but you may prefer to do some research for yourself. @@ -16,7 +16,7 @@ A leap year occurs on any year evenly divisible by 4, but not on a century unles */ //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -43,9 +43,7 @@ A leap year occurs on any year evenly divisible by 4, but not on a century unles unsigned int Problem19::START_YEAR = 1901; //The start year unsigned int Problem19::END_YEAR = 2000; //The stop year -Problem19::Problem19() : Problem("How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?"), totalSundays(0){ -} - +//Return the day of the week that the date you pass into it is on Problem19::DAYS Problem19::getDay(unsigned int month, unsigned int day, unsigned int year){ //Make sure the numbers are within propper bounds if((month < 1) || (month > 12) || (day < 1) || (day > 31) || (year < 1)){ @@ -122,6 +120,7 @@ Problem19::DAYS Problem19::getDay(unsigned int month, unsigned int day, unsigned } } +//Returns true if the year passed to it is a leap year bool Problem19::isLeapYear(unsigned int year){ if(year < 1){ return false; @@ -141,6 +140,11 @@ bool Problem19::isLeapYear(unsigned int year){ return false; } +//Constructor +Problem19::Problem19() : Problem("How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?"), totalSundays(0){ +} + +//Solve the problem void Problem19::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -171,6 +175,13 @@ void Problem19::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem19::reset(){ + Problem::reset(); + totalSundays = 0; +} + +//Return a string with the solution to the problem std::string Problem19::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -181,6 +192,7 @@ std::string Problem19::getString() const{ return results.str(); } +//Returns the total sundays that were asked for uint64_t Problem19::getTotalSundays() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -188,8 +200,3 @@ uint64_t Problem19::getTotalSundays() const{ } return totalSundays; } - -void Problem19::reset(){ - Problem::reset(); - totalSundays = 0; -} diff --git a/Source/Problem2.cpp b/Source/Problem2.cpp index b592a9c..9b63131 100644 --- a/Source/Problem2.cpp +++ b/Source/Problem2.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem2.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem2.cpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //The sum of the even Fibonacci numbers less than 4,000,000 //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -31,11 +31,14 @@ #include "../Headers/Problem2.hpp" +//Holds the largest number that we are looking for uint64_t Problem2::TOP_NUM = 4000000; +//Constructor Problem2::Problem2() : Problem("What is the sum of the even Fibonacci numbers less than 4,000,000?"), fullSum(0){ } +//Solve the problem void Problem2::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -62,6 +65,13 @@ void Problem2::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem2::reset(){ + Problem::reset(); + fullSum = 0; +} + +//Return a string with the solution to the problem std::string Problem2::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -72,6 +82,7 @@ std::string Problem2::getString() const{ return results.str(); } +//Returns the requested sum uint64_t Problem2::getSum() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -79,8 +90,3 @@ uint64_t Problem2::getSum() const{ } return fullSum; } - -void Problem2::reset(){ - Problem::reset(); - fullSum = 0; -} diff --git a/Source/Problem20.cpp b/Source/Problem20.cpp index 9121412..3eb2ec2 100644 --- a/Source/Problem20.cpp +++ b/Source/Problem20.cpp @@ -1,14 +1,14 @@ -//ProjectEuler/C++/Source/Problem20.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem20.cpp //Matthew Ellison // Created: 11-07-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the sum of the digits of 100!? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses //This file contains a header from the gmp library. The library is used for large integers. //You can find more information about them at https://gmplib.org/ //When compiling this file you need to have the gmp library installed as well as linking the libraries to your executable using the -lgmpxx and -lgmp flags /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -33,11 +33,13 @@ #include "../Headers/Problem20.hpp" +//Constructor Problem20::Problem20() : Problem("What is the sum of the digits of 100!?"), num(1), sum(0){ //num Starts at 1 because multiplication is performed on it //sum starts at 0 because addition is performed on it } +//Solve the problem void Problem20::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -66,6 +68,14 @@ void Problem20::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem20::reset(){ + Problem::reset(); + sum = 0; + num = 1; +} + +//Return a string with the solution to the problem std::string Problem20::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -78,6 +88,7 @@ std::string Problem20::getString() const{ return results.str(); } +//Returns the number 100! mpz_class Problem20::getNumber() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -86,6 +97,7 @@ mpz_class Problem20::getNumber() const{ return num; } +//Returns the number 100! in a string std::string Problem20::getNumberString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -94,6 +106,7 @@ std::string Problem20::getNumberString() const{ return num.get_str(); } +//Returns the sum of the digits of 100! uint64_t Problem20::getSum() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -101,9 +114,3 @@ uint64_t Problem20::getSum() const{ } return sum; } - -void Problem20::reset(){ - Problem::reset(); - sum = 0; - num = 1; -} diff --git a/Source/Problem21.cpp b/Source/Problem21.cpp index 9137a3b..9459ad1 100644 --- a/Source/Problem21.cpp +++ b/Source/Problem21.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem21.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem21.cpp //Matthew Ellison // Created: 11-08-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Evaluate the sum of all the amicable numbers under 10000 //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -31,17 +31,21 @@ #include "../Headers/Problem21.hpp" +//The top number that will be evaluated int Problem21::LIMIT = 10000; //The top number that will be evaluated -Problem21::Problem21() : Problem("Evaluate the sum of all the amicable numbers under 10000"){ - reserveVectors(); -} - +//Reserve the size of the vector to speed up insertion void Problem21::reserveVectors(){ divisorSum.reserve(LIMIT); //Reserving it now makes it faster later divisorSum.resize(LIMIT); //Make sure there are enough spaces } +//Constructor +Problem21::Problem21() : Problem("Evaluate the sum of all the amicable numbers under 10000"){ + reserveVectors(); +} + +//Solve the problem void Problem21::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -87,6 +91,15 @@ void Problem21::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem21::reset(){ + Problem::reset(); + divisorSum.clear(); + amicable.clear(); + reserveVectors(); +} + +//Return a string with the solution to the problem std::string Problem21::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -102,6 +115,7 @@ std::string Problem21::getString() const{ return results.str(); } +//Returns a vector with all of the amicable numbers calculated std::vector Problem21::getAmicable() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -110,6 +124,7 @@ std::vector Problem21::getAmicable() const{ return amicable; } +//Returns the sum of all of the amicable numbers uint64_t Problem21::getSum() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -117,10 +132,3 @@ uint64_t Problem21::getSum() const{ } return mee::getSum(amicable); } - -void Problem21::reset(){ - Problem::reset(); - divisorSum.clear(); - amicable.clear(); - reserveVectors(); -} diff --git a/Source/Problem22.cpp b/Source/Problem22.cpp index d1c1f17..ab9e44c 100644 --- a/Source/Problem22.cpp +++ b/Source/Problem22.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem22.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem22.cpp //Matthew Ellison // Created: 11-09-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the total of all the name scores in the file? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,6 +32,7 @@ #include "../Headers/Problem22.hpp" +//Holds the names that will be scored std::vector Problem22::names = { "MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA","SUSAN","MARGARET","DOROTHY","LISA","NANCY","KAREN", "BETTY","HELEN","SANDRA","DONNA","CAROL","RUTH","SHARON","MICHELLE","LAURA","SARAH","KIMBERLY","DEBORAH","JESSICA","SHIRLEY", "CYNTHIA","ANGELA","MELISSA","BRENDA","AMY","ANNA","REBECCA","VIRGINIA","KATHLEEN","PAMELA","MARTHA","DEBRA","AMANDA","STEPHANIE", @@ -401,10 +402,7 @@ std::vector Problem22::names = { "MARY","PATRICIA","LINDA","BARBARA "KENETH","JACINTO","GRAIG","FRANKLYN","EDMUNDO","SID","PORTER","LEIF","JERAMY","BUCK","WILLIAN","VINCENZO","SHON","LYNWOOD","JERE", "HAI","ELDEN","DORSEY","DARELL","BRODERICK","ALONSO"}; -Problem22::Problem22() : Problem("What is the total of all the name scores in the file?"){ - reserveVectors(); -} - +//Reserve the size of the vector to speed up insertion void Problem22::reserveVectors(){ //Make sure the vector is the right size sums.reserve(names.size()); @@ -414,6 +412,12 @@ void Problem22::reserveVectors(){ prod.resize(names.size()); } +//Constructor +Problem22::Problem22() : Problem("What is the total of all the name scores in the file?"){ + reserveVectors(); +} + +//Solve the problem void Problem22::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -445,6 +449,15 @@ void Problem22::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem22::reset(){ + Problem::reset(); + sums.clear(); + prod.clear(); + reserveVectors(); +} + +//Return a string with the solution to the problem std::string Problem22::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -472,10 +485,3 @@ uint64_t Problem22::getNameScoreSum() const{ } return mee::getSum(prod); } - -void Problem22::reset(){ - Problem::reset(); - sums.clear(); - prod.clear(); - reserveVectors(); -} diff --git a/Source/Problem23.cpp b/Source/Problem23.cpp index 8bf9213..cb2928b 100644 --- a/Source/Problem23.cpp +++ b/Source/Problem23.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem23.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem23.cpp //Matthew Ellison // Created: 11-09-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,18 +32,10 @@ #include "../Headers/Problem23.hpp" +//The largest possible number that can not be written as the sum of two abundant numbers int Problem23::MAX_NUM = 28123; -Problem23::Problem23() : Problem("Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers"), sum(0){ - reserveVectors(); -} - -void Problem23::reserveVectors(){ - //This makes sure the vector is the correct size - divisorSums.reserve(MAX_NUM); - divisorSums.resize(MAX_NUM); -} - +//A function that returns true if num can be created by adding two elements from abund and false if it cannot bool Problem23::isSum(const std::vector& abund, int num){ int64_t sum = 0; //Pick a number for the first part of the sum @@ -63,6 +55,19 @@ bool Problem23::isSum(const std::vector& abund, int num){ return false; } +//Reserve the size of the vector to speed up insertion +void Problem23::reserveVectors(){ + //This makes sure the vector is the correct size + divisorSums.reserve(MAX_NUM + 1); + divisorSums.resize(MAX_NUM + 1); +} + +//Constructor +Problem23::Problem23() : Problem("Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers"), sum(0){ + reserveVectors(); +} + +//Solve the problem void Problem23::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -73,7 +78,7 @@ void Problem23::solve(){ timer.start(); //Get the sum of the divisors of all numbers < MAX_NUM - for(int cnt = 1;cnt < MAX_NUM;++cnt){ + for(int cnt = 1;cnt <= MAX_NUM;++cnt){ std::vector div = mee::getDivisors(cnt); if(div.size() > 1){ div.pop_back(); //Remove the last element, which is the number itself. This gives us the propper divisors @@ -90,7 +95,7 @@ void Problem23::solve(){ } //Check if each number can be the sum of 2 abundant numbers and add to the sum if no - for(int cnt = 1;cnt < MAX_NUM;++cnt){ + for(int cnt = 1;cnt <= MAX_NUM;++cnt){ if(!isSum(abund, cnt)){ sum += cnt; } @@ -103,6 +108,15 @@ void Problem23::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem23::reset(){ + Problem::reset(); + sum = 0; + divisorSums.clear(); + reserveVectors(); +} + +//Return a string with the solution to the problem std::string Problem23::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -113,6 +127,7 @@ std::string Problem23::getString() const{ return results.str(); } +//Returns the sum of the numbers asked for uint64_t Problem23::getSum() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -120,10 +135,3 @@ uint64_t Problem23::getSum() const{ } return sum; } - -void Problem23::reset(){ - Problem::reset(); - sum = 0; - divisorSums.clear(); - reserveVectors(); -} diff --git a/Source/Problem24.cpp b/Source/Problem24.cpp index 4170886..bcaf285 100644 --- a/Source/Problem24.cpp +++ b/Source/Problem24.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem24.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem24.cpp //Matthew Ellison // Created: 11-11-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -30,13 +30,16 @@ #include "../Headers/Problem24.hpp" -int Problem24::NEEDED_PERM = 1000000; //The number of the permutation that you need -std::string Problem24::nums = "0123456789"; //All of the characters that we need to get the permutations of +//The number of the permutation that you need +int Problem24::NEEDED_PERM = 1000000; +//All of the characters that we need to get the permutations of +std::string Problem24::nums = "0123456789"; +//Constructor Problem24::Problem24() : Problem("What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?"){ - } +//Solve the problem void Problem24::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -56,6 +59,13 @@ void Problem24::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem24::reset(){ + Problem::reset(); + permutations.clear(); +} + +//Return a string with the solution to the problem std::string Problem24::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -84,8 +94,3 @@ std::string Problem24::getPermutation() const{ } return permutations.at(NEEDED_PERM - 1); } - -void Problem24::reset(){ - Problem::reset(); - permutations.clear(); -} diff --git a/Source/Problem25.cpp b/Source/Problem25.cpp index 23174bd..aa90aae 100644 --- a/Source/Problem25.cpp +++ b/Source/Problem25.cpp @@ -1,14 +1,14 @@ -//ProjectEuler/C++/Source/Problem25.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem25.cpp //Matthew Ellison // Created: 11-13-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the index of the first term in the Fibonacci sequence to contain 1000 digits? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses //This file contains a header from the gmp library. The library is used for large integers. //You can find more information about them at https://gmplib.org/ //When compiling this file you need to have the gmp library installed as well as linking the libraries to your executable using the -lgmpxx and -lgmp flags /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -33,13 +33,16 @@ #include "../Headers/Problem25.hpp" +//The number of digits to calculate up to unsigned int Problem25::NUM_DIGITS = 1000; //The number of digits to calculate up to +//Constructor Problem25::Problem25() : Problem("What is the index of the first term in the Fibonacci sequence to contain 1000 digits?"), number(0), index(2){ number = 0; index = 0; } +//Solve the problem void Problem25::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -62,6 +65,14 @@ void Problem25::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem25::reset(){ + Problem::reset(); + number = 0; + index = 2; +} + +//Return a string with the solution to the problem std::string Problem25::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -118,9 +129,3 @@ uint64_t Problem25::getIndexInt() const{ } return index.get_ui(); } - -void Problem25::reset(){ - Problem::reset(); - number = 0; - index = 2; -} diff --git a/Source/Problem26.cpp b/Source/Problem26.cpp index 2381629..b382b5f 100644 --- a/Source/Problem26.cpp +++ b/Source/Problem26.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Headers/Problem26.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem26.cpp //Matthew Ellison // Created: 07-28-19 -//Modified: 07-28-19 +//Modified: 07-09-20 //Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part. //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -29,13 +29,16 @@ #include "../Headers/Problem26.hpp" +//Holds the highest denominator we will check unsigned int Problem26::TOP_NUMBER = 999; +//Constructor Problem26::Problem26() : Problem("Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part."), longestCycle(0), longestNumber(1){ longestCycle = 0; longestNumber = 0; } +//Solve the problem void Problem26::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -90,6 +93,14 @@ void Problem26::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem26::reset(){ + Problem::reset(); + longestCycle = 0; + longestNumber = 1; +} + +//Return a string with the solution to the problem std::string Problem26::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -103,6 +114,7 @@ std::string Problem26::getString() const{ return results.str(); } +//Returns the length of the longest cycle unsigned int Problem26::getLongestCycle() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -111,6 +123,7 @@ unsigned int Problem26::getLongestCycle() const{ return longestCycle; } +//Returns the denominator that starts the longest cycle unsigned int Problem26::getLongestNumber() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -118,9 +131,3 @@ unsigned int Problem26::getLongestNumber() const{ } return longestNumber; } - -void Problem26::reset(){ - Problem::reset(); - longestCycle = 0; - longestNumber = 1; -} diff --git a/Source/Problem27.cpp b/Source/Problem27.cpp index f430f46..4259e20 100644 --- a/Source/Problem27.cpp +++ b/Source/Problem27.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem27.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem27.cpp //Matthew Ellison // Created: 09-14-19 -//Modified: 09-14-19 +//Modified: 07-09-20 //Find the product of the coefficients, |a| < 1000 and |b| <= 1000, for the quadratic expression that produces the maximum number of primes for consecutive values of n, starting with n=0. //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -28,10 +28,12 @@ #include "../Headers/Problem27.hpp" +//Constructor Problem27::Problem27() : Problem("Considering quadratics of the form n^2 + an + b, where |a| < 1000 and |b| <= 1000, find the product of the coefficients a and b that produce the maximum number of primes for consecutive values of n starting with n = 0."){ topA = topB = topN = 0; } +//Solve the problem void Problem27::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -72,6 +74,14 @@ void Problem27::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem27::reset(){ + Problem::reset(); + topA = topB = topN = 0; + primes.clear(); +} + +//Return a string with the solution to the problem std::string Problem27::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -86,6 +96,7 @@ std::string Problem27::getString() const{ return results.str(); } +//Returns the top A that was generated int64_t Problem27::getTopA() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -94,6 +105,7 @@ int64_t Problem27::getTopA() const{ return topA; } +//Returns the top B that was generated int64_t Problem27::getTopB() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -102,6 +114,7 @@ int64_t Problem27::getTopB() const{ return topB; } +//Returns the top N that was generated int64_t Problem27::getTopN() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -109,9 +122,3 @@ int64_t Problem27::getTopN() const{ } return topN; } - -void Problem27::reset(){ - Problem::reset(); - topA = topB = topN = 0; - primes.clear(); -} diff --git a/Source/Problem28.cpp b/Source/Problem28.cpp index 94dd691..bc310b6 100644 --- a/Source/Problem28.cpp +++ b/Source/Problem28.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem28.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem28.cpp //Matthew Ellison // Created: 09-21-19 -//Modified: 09-21-19 +//Modified: 07-09-20 //What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed by starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -29,10 +29,7 @@ #include "../Headers/Problem28.hpp" -Problem28::Problem28() : Problem("What is the sum of the number on the diagonals in a 1001 x 1001 spiral formed by starting with the number 1 and moving to the right in a clockwise direction?"){ - setupGrid(); - sumOfDiagonals = 0; -} +//This sets up the grid to hold the correct number of variables void Problem28::setupGrid(){ //Set the size of the grid to 1001 x 1001 for(int cnt = 0;cnt < 1001;++cnt){ @@ -43,7 +40,7 @@ void Problem28::setupGrid(){ } } -//Sets up the grid +//Puts all of the numbers in the grid up the grid void Problem28::createGrid(){ bool finalLocation = false; //A flag to indicate if the final location to be filled has been reached //Set the number that is going to be put at each location @@ -109,6 +106,13 @@ void Problem28::findSum(){ } } +//Constructor +Problem28::Problem28() : Problem("What is the sum of the number on the diagonals in a 1001 x 1001 spiral formed by starting with the number 1 and moving to the right in a clockwise direction?"){ + setupGrid(); + sumOfDiagonals = 0; +} + +//Solve the problem void Problem28::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -132,6 +136,15 @@ void Problem28::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem28::reset(){ + Problem::reset(); + sumOfDiagonals = 0; + grid.clear(); + setupGrid(); +} + +//Return a string with the solution to the problem std::string Problem28::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -161,10 +174,3 @@ uint64_t Problem28::getSum() const{ } return sumOfDiagonals; } - -void Problem28::reset(){ - Problem::reset(); - sumOfDiagonals = 0; - grid.clear(); - setupGrid(); -} diff --git a/Source/Problem29.cpp b/Source/Problem29.cpp index a73c285..ac06e51 100644 --- a/Source/Problem29.cpp +++ b/Source/Problem29.cpp @@ -1,14 +1,14 @@ -//ProjectEuler/C++/Source/Problem29.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem29.cpp //Matthew Ellison // Created: 10-06-19 -//Modified: 10-06-19 +//Modified: 07-09-20 //How many distinct terms are in the sequence generated by a^b for 2 <= a <= 100 and 2 <= b <= 100? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses //This file contains a header from the gmp library. The library is used for large integers. //You can find more information about them at https://gmplib.org/ //When compiling this file you need to have the gmp library installed as well as linking the libraries to your executable using the -lgmpxx and -lgmp flags /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -34,9 +34,20 @@ #include "Algorithms.hpp" +//The lowest possible value for a +unsigned int Problem29::BOTTOM_A = 2; +//The highest possible value for a +unsigned int Problem29::TOP_A = 100; +//The lowest possible value for b +unsigned int Problem29::BOTTOM_B = 2; +//The highest possible value for b +unsigned int Problem29::TOP_B = 100; + +//Constructor Problem29::Problem29() : Problem("How many distict terms are in the sequence generated by a^b for 2 <= a <= 100 and 2 <= b <= 100?"){ } +//Solve the problem void Problem29::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -66,6 +77,13 @@ void Problem29::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem29::reset(){ + Problem::reset(); + unique.clear(); +} + +//Return a string with the solution to the problem std::string Problem29::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -78,6 +96,7 @@ std::string Problem29::getString() const{ return results.str(); } +//Returns the lowest possible value for a unsigned int Problem29::getBottomA() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -86,6 +105,7 @@ unsigned int Problem29::getBottomA() const{ return BOTTOM_A; } +//Returns the highest possible value for a unsigned int Problem29::getTopA() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -94,6 +114,7 @@ unsigned int Problem29::getTopA() const{ return TOP_A; } +//Returns the lowest possible value for b unsigned int Problem29::getBottomB() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -102,6 +123,7 @@ unsigned int Problem29::getBottomB() const{ return BOTTOM_B; } +//Returns the highest possible value for b unsigned int Problem29::getTopB() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -110,6 +132,7 @@ unsigned int Problem29::getTopB() const{ return TOP_B; } +//Returns a vector of all the unique values for a^b std::vector Problem29::getUnique() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -117,8 +140,3 @@ std::vector Problem29::getUnique() const{ } return unique; } - -void Problem29::reset(){ - Problem::reset(); - unique.clear(); -} diff --git a/Source/Problem3.cpp b/Source/Problem3.cpp index 4bc8fc0..776afa1 100644 --- a/Source/Problem3.cpp +++ b/Source/Problem3.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem3.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem3.cpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //The largest prime factor of 600851475143 //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,11 +32,14 @@ #include "../Headers/Problem3.hpp" +//The number of which you are trying to find the factors uint64_t Problem3::GOAL_NUMBER = 600851475143; +//Constructor Problem3::Problem3() : Problem("What is the largest prime factor of 600851475143?"){ } +//Solve the problem void Problem3::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -55,6 +58,13 @@ void Problem3::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem3::reset(){ + Problem::reset(); + factors.clear(); +} + +//Return a string with the solution to the problem std::string Problem3::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -65,6 +75,7 @@ std::string Problem3::getString() const{ return results.str(); } +//Returns the list of factors of the number std::vector Problem3::getFactors() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -73,6 +84,7 @@ std::vector Problem3::getFactors() const{ return factors; } +//Returns the largest factor of the number uint64_t Problem3::getLargestFactor() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -82,6 +94,7 @@ uint64_t Problem3::getLargestFactor() const{ return *factors.end(); } +//Returns the number uint64_t Problem3::getGoalNumber() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -89,8 +102,3 @@ uint64_t Problem3::getGoalNumber() const{ } return GOAL_NUMBER; } - -void Problem3::reset(){ - Problem::reset(); - factors.clear(); -} diff --git a/Source/Problem30.cpp b/Source/Problem30.cpp index 9e3860c..a2d594f 100644 --- a/Source/Problem30.cpp +++ b/Source/Problem30.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem30.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem30.cpp //Matthew Ellison // Created: 10-27-19 -//Modified: 10-27-19 +//Modified: 07-09-20 //Find the sum of all the numbers that can be written as the sum of the fifth powers of their digits. //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -30,8 +30,12 @@ #include "../Headers/Problem30.hpp" -Problem30::Problem30() : Problem("Find the sum of all the numbers that can be written as a sum of the fifth powers of their digits"){ -} +//This is the largest number that will be checked +uint64_t Problem30::TOP_NUM = 1000000; +//Start with 2 because 0 and 1 don't count +uint64_t Problem30::BOTTOM_NUM = 2; +//This is the power that the digits are raised to +uint64_t Problem30::POWER_RAISED = 5; //Returns a vector with the indivitual digits of the number passed into it std::vector Problem30::getDigits(uint64_t num){ @@ -46,6 +50,11 @@ std::vector Problem30::getDigits(uint64_t num){ return listOfDigits; } +//Constructor +Problem30::Problem30() : Problem("Find the sum of all the numbers that can be written as a sum of the fifth powers of their digits"){ +} + +//Solve the problem void Problem30::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -78,6 +87,13 @@ void Problem30::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem30::reset(){ + Problem::reset(); + sumOfFifthNumbers.clear(); +} + +//Return a string with the solution to the problem std::string Problem30::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -124,8 +140,3 @@ uint64_t Problem30::getSumOfList() const{ return sum; } - -void Problem30::reset(){ - Problem::reset(); - sumOfFifthNumbers.clear(); -} diff --git a/Source/Problem31.cpp b/Source/Problem31.cpp index 18f1f20..0f7c715 100644 --- a/Source/Problem31.cpp +++ b/Source/Problem31.cpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Source/Problem31.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem31.cpp //Matthew Ellison // Created: 06-19-20 -//Modified: 06-19-20 +//Modified: 07-09-20 //How many different ways can £2 be made using any number of coins? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* @@ -28,12 +28,15 @@ #include "../Headers/Problem31.hpp" +//The value of coins we want int Problem31::desiredValue = 200; +//Constructor Problem31::Problem31() : Problem("How many different ways can 2 pounds be made using any number of coins?"){ permutations = 0; } +//Solve the problem void Problem31::solve(){ //If the problem has alread been solved do nothing and end the function if(solved){ @@ -68,6 +71,13 @@ void Problem31::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem31::reset(){ + Problem::reset(); + permutations = 0; +} + +//Return a string with the solution to the problem std::string Problem31::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -84,8 +94,3 @@ std::string Problem31::getString() const{ int Problem31::getPermutations() const{ return permutations; } - -void Problem31::reset(){ - Problem::reset(); - permutations = 0; -} diff --git a/Source/Problem4.cpp b/Source/Problem4.cpp index 8605d08..5c19f1a 100644 --- a/Source/Problem4.cpp +++ b/Source/Problem4.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem4.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem4.cpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the largest palindrome made from the product of two 3-digit numbers //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -31,12 +31,16 @@ #include "../Headers/Problem4.hpp" +//The first number to check int Problem4::START_NUM = 100; +//The last number to check int Problem4::END_NUM = 999; +//Constructor Problem4::Problem4() : Problem("Find the largest palindrome made from the product of two 3-digit numbers."){ } +//Solve the problem void Problem4::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -75,6 +79,13 @@ void Problem4::solve(){ solved = true; } +//Resets the problem so it can be run again +void Problem4::reset(){ + Problem::reset(); + palindromes.clear(); +} + +//Return a string with the solution to the problem std::string Problem4::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -86,6 +97,7 @@ std::string Problem4::getString() const{ return results.str(); } +//Returns the list of all palindromes std::vector Problem4::getPalindromes() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -94,6 +106,7 @@ std::vector Problem4::getPalindromes() const{ return palindromes; } +//Returns the largest palindrome uint64_t Problem4::getLargestPalindrome() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -101,8 +114,3 @@ uint64_t Problem4::getLargestPalindrome() const{ } return *(palindromes.end() - 1); } - -void Problem4::reset(){ - Problem::reset(); - palindromes.clear(); -} diff --git a/Source/Problem5.cpp b/Source/Problem5.cpp index 635dd07..4dc454d 100644 --- a/Source/Problem5.cpp +++ b/Source/Problem5.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem5.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem5.cpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -31,9 +31,11 @@ #include "../Headers/Problem5.hpp" +//Constructor Problem5::Problem5() : Problem("What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?"), smallestNum(0){ } +//Solve the problem void Problem5::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -74,6 +76,13 @@ void Problem5::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem5::reset(){ + Problem::reset(); + smallestNum = 0; +} + +//Return a string with the solution to the problem std::string Problem5::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -84,6 +93,7 @@ std::string Problem5::getString() const{ return results.str(); } +//Returns the requested number int Problem5::getNumber() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -91,8 +101,3 @@ int Problem5::getNumber() const{ } return smallestNum; } - -void Problem5::reset(){ - Problem::reset(); - smallestNum = 0; -} diff --git a/Source/Problem6.cpp b/Source/Problem6.cpp index 1a589d2..cb1e888 100644 --- a/Source/Problem6.cpp +++ b/Source/Problem6.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem6.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem6.cpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum. //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -31,12 +31,14 @@ #include "../Headers/Problem6.hpp" -int Problem6::START_NUM = 1; -int Problem6::END_NUM = 100; +int Problem6::START_NUM = 1; //The first number to check +int Problem6::END_NUM = 100; //The last number to check +//Constructor Problem6::Problem6() : Problem("Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum."), sumOfSquares(0), squareOfSum(0){ } +//Solve the problem void Problem6::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -60,6 +62,13 @@ void Problem6::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem6::reset(){ + Problem::reset(); + sumOfSquares = squareOfSum = 0; +} + +//Return a string with the solution to the problem std::string Problem6::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -70,6 +79,7 @@ std::string Problem6::getString() const{ return results.str(); } +//Returns the sum of all the squares uint64_t Problem6::getSumOfSquares() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -78,6 +88,7 @@ uint64_t Problem6::getSumOfSquares() const{ return sumOfSquares; } +//Returns the square of all of the sums uint64_t Problem6::getSquareOfSum() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -86,6 +97,7 @@ uint64_t Problem6::getSquareOfSum() const{ return squareOfSum; } +//Returns the requested difference uint64_t Problem6::getDifference() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -93,8 +105,3 @@ uint64_t Problem6::getDifference() const{ } return abs(sumOfSquares - squareOfSum); } - -void Problem6::reset(){ - Problem::reset(); - sumOfSquares = squareOfSum = 0; -} diff --git a/Source/Problem67.cpp b/Source/Problem67.cpp index 06b9165..7539389 100644 --- a/Source/Problem67.cpp +++ b/Source/Problem67.cpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Source/Problem67.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem67.cpp //Matthew Ellison // Created: 11-02-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //The way to do this is using a breadth first search /* Find the maximum total from top to bottom @@ -108,7 +108,7 @@ Find the maximum total from top to bottom */ //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -133,6 +133,7 @@ Find the maximum total from top to bottom #include "../Headers/Problem67.hpp" +//This is the list you are trying to find a path through std::vector Problem67::list[NUM_ROWS] = { {59}, {73, 41}, @@ -236,9 +237,7 @@ std::vector Problem67::list[NUM_ROWS] = { {23, 33, 44, 81, 80, 92, 93, 75, 94, 88, 23, 61, 39, 76, 22, 03, 28, 94, 32, 06, 49, 65, 41, 34, 18, 23, 8, 47, 62, 60, 03, 63, 33, 13, 80, 52, 31, 54, 73, 43, 70, 26, 16, 69, 57, 87, 83, 31, 03, 93, 70, 81, 47, 95, 77, 44, 29, 68, 39, 51, 56, 59, 63, 07, 25, 70, 07, 77, 43, 53, 64, 03, 94, 42, 95, 39, 18, 01, 66, 21, 16, 97, 20, 50, 90, 16, 70, 10, 95, 69, 29, 06, 25, 61, 41, 26, 15, 59, 63, 35}, }; -Problem67::Problem67() : Problem("Find the maximum total from the top to the bottom of the pyramid."){ -} - +//This function takes every number in the vector and changes it to 100 - the number void Problem67::invert(){ for(unsigned int rowCnt = 0;rowCnt < NUM_ROWS;++rowCnt){ for(unsigned int colCnt = 0;colCnt < list[rowCnt].size();++colCnt){ @@ -247,6 +246,11 @@ void Problem67::invert(){ } } +//Constructor +Problem67::Problem67() : Problem("Find the maximum total from the top to the bottom of the pyramid."){ +} + +//Solve the problem void Problem67::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -311,6 +315,15 @@ void Problem67::solve(){ solved = true; } +//Clears all of the variables so the problem can be run again +void Problem67::reset(){ + Problem::reset(); + foundPoints.clear(); + possiblePoints.clear(); + actualTotal = 0; +} + +//Return a string with the solution to the problem std::string Problem67::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -404,11 +417,3 @@ int Problem67::getTotal() const{ } return actualTotal; } - -//Clears all of the variables so the problem can be run again -void Problem67::reset(){ - Problem::reset(); - foundPoints.clear(); - possiblePoints.clear(); - actualTotal = 0; -} diff --git a/Source/Problem7.cpp b/Source/Problem7.cpp index 52c0f90..cf32dd5 100644 --- a/Source/Problem7.cpp +++ b/Source/Problem7.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem7.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem7.cpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //What is the 10001th prime number? //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -32,11 +32,14 @@ #include "../Headers/Problem7.hpp" +//The index of the prime number to find uint64_t Problem7::NUMBER_OF_PRIMES = 10001; +//Constructor Problem7::Problem7() : Problem("What is the 10001th prime number?"){ } +//Solve the problem void Problem7::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -55,6 +58,12 @@ void Problem7::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem7::reset(){ + Problem::reset(); +} + +//Return a string with the solution to the problem std::string Problem7::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -65,6 +74,7 @@ std::string Problem7::getString() const{ return results.str(); } +//Returns the requested prime number uint64_t Problem7::getPrime() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -72,7 +82,3 @@ uint64_t Problem7::getPrime() const{ } return *primes.end(); } - -void Problem7::reset(){ - Problem::reset(); -} diff --git a/Source/Problem8.cpp b/Source/Problem8.cpp index 01d7c41..91a80bd 100644 --- a/Source/Problem8.cpp +++ b/Source/Problem8.cpp @@ -1,7 +1,7 @@ -//ProjectEuler/C++/Source/Problem8.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem8.cpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product? /* 73167176531330624919225119674426574742355349194934 @@ -27,7 +27,7 @@ */ //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -53,11 +53,14 @@ #include "../Headers/Problem8.hpp" +//The number that we are working with std::string Problem8::number = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"; +//Constructor Problem8::Problem8() : Problem("Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product?"), maxProduct(0){ } +//Solve the problem void Problem8::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -85,6 +88,14 @@ void Problem8::solve(){ solved = true; } +//Reset the problem so it can be run +void Problem8::reset(){ + Problem::reset(); + maxNums = ""; + maxProduct = 0; +} + +//Return a string with the solution to the problem std::string Problem8::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -96,6 +107,7 @@ std::string Problem8::getString() const{ return results.str(); } +//Returns the string of numbers that produces the largest product std::string Problem8::getLargestNums() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -104,6 +116,7 @@ std::string Problem8::getLargestNums() const{ return maxNums; } +//Returns the requested product uint64_t Problem8::getLargestProduct() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -111,9 +124,3 @@ uint64_t Problem8::getLargestProduct() const{ } return maxProduct; } - -void Problem8::reset(){ - Problem::reset(); - maxNums = ""; - maxProduct = 0; -} diff --git a/Source/Problem9.cpp b/Source/Problem9.cpp index 9bea704..18ccd94 100644 --- a/Source/Problem9.cpp +++ b/Source/Problem9.cpp @@ -1,11 +1,11 @@ -//ProjectEuler/C++/Source/Problem9.cpp +//ProjectEuler/ProjectEulerCPP/Source/Problem9.cpp //Matthew Ellison // Created: 09-28-18 -//Modified: 07-14-19 +//Modified: 07-09-20 //There exists exactly one Pythagorean triplet for which a + b + c = 1000. Find the product of abc. //Unless otherwise listed all non-standard includes are my own creation and available from https://bibucket.org/Mattrixwv/myClasses /* - Copyright (C) 2019 Matthew Ellison + Copyright (C) 2020 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 @@ -30,9 +30,11 @@ #include "../Headers/Problem9.hpp" +//Constructor Problem9::Problem9() : Problem("There exists exactly one Pythagorean triplet for which a + b + c = 1000. Find the product of abc."), a(1), b(0), c(0), found(false){ } +//Solve the problem void Problem9::solve(){ //If the problem has already been solved do nothing and end the function if(solved){ @@ -68,6 +70,16 @@ void Problem9::solve(){ solved = true; } +//Reset the problem so it can be run again +void Problem9::reset(){ + Problem::reset(); + a = 1; + b = 0; + c = 0; + found = false; +} + +//Return a string with the solution to the problem std::string Problem9::getString() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -85,6 +97,7 @@ std::string Problem9::getString() const{ return results.str(); } +//Returns the length of the first side int Problem9::getSideA() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -93,6 +106,7 @@ int Problem9::getSideA() const{ return a; } +//Returns the length of the second side int Problem9::getSideB() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -101,6 +115,7 @@ int Problem9::getSideB() const{ return b; } +//Returns the length of the hyp int Problem9::getSideC() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -109,6 +124,7 @@ int Problem9::getSideC() const{ return (int)c; } +//Returns the product of the 3 sides int Problem9::getProduct() const{ //If the problem hasn't been solved throw an exception if(!solved){ @@ -116,11 +132,3 @@ int Problem9::getProduct() const{ } return a * b * (int)c; } - -void Problem9::reset(){ - Problem::reset(); - a = 1; - b = 0; - c = 0; - found = false; -}