project-euler

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

commit 1200e4df6af5c92ebadb90d2cab4278a2d357725
parent 5efc6904b6eab1c3a82ce96fbb24a62f8082df8d
Author: mpizzzle <m@michaelpercival.xyz>
Date:   Mon, 21 Sep 2020 18:06:01 +0100

fixing compilation errors and warnings

Diffstat:
MEulerUtility.cpp | 4+++-
MEulerUtility.h | 1+
MEuler_10.cpp | 5+----
MEuler_17.cpp | 7+++----
MEuler_35.cpp | 5+++--
MEuler_37.cpp | 6+++---
MEuler_44.cpp | 5++---
MEuler_46.cpp | 7+++----
MEuler_49.cpp | 11+++++------
MEuler_5.cpp | 7+++----
MEuler_51.cpp | 7+++----
DEuler_53.cpp | 14--------------
MEuler_54.cpp | 42+++++++++++++++++++++++-------------------
MEuler_64.cpp | 5++---
MEuler_7.cpp | 2--
MEuler_74.cpp | 7+++----
MEuler_75.cpp | 5++---
MEuler_76.cpp | 17+++++++++--------
MEuler_77.cpp | 8+++++---
MEuler_79.cpp | 4++--
Mbigint/Euler_43.cpp | 2+-
Abigint/Euler_53.cpp | 15+++++++++++++++
Mmain.cpp | 25++++++++++++-------------
23 files changed, 104 insertions(+), 107 deletions(-)

diff --git a/EulerUtility.cpp b/EulerUtility.cpp @@ -461,7 +461,7 @@ llui EulerUtility::phi(int n, std::vector<int> &primes, std::vector<int> &primes return n - 1; // Even number? - if (n & 1 == 0) + if ((n & 1) == 0) { int m = n >> 1; return !(m & 1) ? EulerUtility::phi(m, primes, primesIndexed) << 1 : EulerUtility::phi(m, primes, primesIndexed); @@ -478,4 +478,6 @@ llui EulerUtility::phi(int n, std::vector<int> &primes, std::vector<int> &primes int d = EulerUtility::gcd(m, o); return (d == 1) ? EulerUtility::phi(m, primes, primesIndexed) * EulerUtility::phi(o, primes, primesIndexed) : EulerUtility::phi(m, primes, primesIndexed) * EulerUtility::phi(o, primes, primesIndexed) * d / EulerUtility::phi(d, primes, primesIndexed); } + + return 0; } diff --git a/EulerUtility.h b/EulerUtility.h @@ -1,3 +1,4 @@ +#include <cmath> #include <string> #include <vector> diff --git a/Euler_10.cpp b/Euler_10.cpp @@ -2,8 +2,6 @@ llui Euler::SumOfPrimesUnder2m() { - int noOfPrimes = 0; - bool is_prime; llui count = 2; //includes 2 & 3 @@ -21,4 +19,4 @@ llui Euler::SumOfPrimesUnder2m() } return count; -}- No newline at end of file +} diff --git a/Euler_17.cpp b/Euler_17.cpp @@ -10,7 +10,7 @@ int tenz(int ten, int j, int k) return (j == 1) ? ((k == 0) ? ten : 0) : ten; } -int and(int count) +int _and(int count) { return ((count >= 100) && (count % 100 != 0)) ? std::string("and").length() : 0; } @@ -31,7 +31,7 @@ int Euler::LetterCounter() for (int i = 0; i < 10; ++i) for (int j = 0; j < 10; ++j) for (int k = 0; k < 10; ++k) - sum += x_hundred(digits, i) + and(i * 100 + j * 10 + k) + tenz(tens[j].length(), j, k) + digit(digits, teens, j, k); + sum += x_hundred(digits, i) + _and(i * 100 + j * 10 + k) + tenz(tens[j].length(), j, k) + digit(digits, teens, j, k); return sum; -}- No newline at end of file +} diff --git a/Euler_35.cpp b/Euler_35.cpp @@ -1,3 +1,5 @@ +#include <algorithm> + #include "Euler.h" int Euler::NoOfCircularPrimes() @@ -39,4 +41,4 @@ int Euler::NoOfCircularPrimes() } return total; -}- No newline at end of file +} diff --git a/Euler_37.cpp b/Euler_37.cpp @@ -7,7 +7,8 @@ bool isTruncPrime(std::string &p, std::vector<int> &primes, bool left) if (p.size() == 1) return isPrime; - return (isPrime) ? isTruncPrime(p.substr(left, p.size() - 1), primes, left) : false; + std::string p_substr = p.substr(left, p.size() - 1); + return (isPrime) ? isTruncPrime(p_substr, primes, left) : false; } llui Euler::TruncatablePrimes() @@ -24,4 +25,4 @@ llui Euler::TruncatablePrimes() } return sum; -}- No newline at end of file +} diff --git a/Euler_44.cpp b/Euler_44.cpp @@ -14,10 +14,10 @@ int Euler::MinimizedPentagonalDifference() { pentaNos.push_back(getPentagonal(pentaNos.size() + 1)); - for (int j = 0; j < pentaNos.size() - 1; ++j) + for (uint64_t j = 0; j < pentaNos.size() - 1; ++j) if (EulerUtility::isPentagonal(pentaNos[pentaNos.size() - 1] + pentaNos[j]) && EulerUtility::isPentagonal(pentaNos[pentaNos.size() - 1] - pentaNos[j])) return pentaNos[pentaNos.size() - 1] - pentaNos[j]; } return 0; -}- No newline at end of file +} diff --git a/Euler_46.cpp b/Euler_46.cpp @@ -4,13 +4,13 @@ llui Euler::GoldbachsOtherConjecture() { std::vector<int> primes = EulerUtility::getPrimesUnderCeilingIndexed(1000000); - for (int i = 33; i < primes.size(); ++i) + for (uint64_t i = 33; i < primes.size(); ++i) { if ((i & 1) && primes[i] == -1) { bool conjecture_holds = false; - for (int j = 0; j < i; ++j) + for (uint64_t j = 0; j < i; ++j) { if (primes[j] != -1) { @@ -28,4 +28,4 @@ llui Euler::GoldbachsOtherConjecture() } return 0; -}- No newline at end of file +} diff --git a/Euler_49.cpp b/Euler_49.cpp @@ -14,7 +14,7 @@ std::string Euler::PrimePermutations() bool isUniquePermutation = true; std::string s = std::to_string(p); - for (int i = 0; i < primePermutations.size(); ++i) + for (uint64_t i = 0; i < primePermutations.size(); ++i) { if (std::is_permutation(primePermutations[i][0].begin(), primePermutations[i][0].end(), s.begin())) { @@ -32,11 +32,11 @@ std::string Euler::PrimePermutations() for (std::vector<std::string> pp : primePermutations) if (pp.size() > 2) - for (int i = 0; i < pp.size() - 2; ++i) - for (int j = i + 1; j < pp.size() - 1; ++j) - for (int k = j + 1; k < pp.size(); ++k) + for (uint64_t i = 0; i < pp.size() - 2; ++i) + for (uint64_t j = i + 1; j < pp.size() - 1; ++j) + for (uint64_t k = j + 1; k < pp.size(); ++k) if ((atoi(pp[j].c_str()) * 2) - atoi(pp[i].c_str()) == atoi(pp[k].c_str())) return pp[i] + pp[j] + pp[k]; return nullptr; -}- No newline at end of file +} diff --git a/Euler_5.cpp b/Euler_5.cpp @@ -19,7 +19,7 @@ void addNewPrimeFactors(int nextDivisor, std::vector<int> &p_factors, std::vecto ++i; } - for (int j = 0; j < myPrimeFactors.size(); ++j) + for (uint64_t j = 0; j < myPrimeFactors.size(); ++j) if (p_factors[j] < myPrimeFactors[j]) p_factors[j] = myPrimeFactors[j]; } @@ -34,9 +34,9 @@ int Euler::DivisibleBy1To20() for (int i = 2; i <= ceiling; ++i) addNewPrimeFactors(i, noOfPrimeFactors, primes); - for (int i = 0; i < noOfPrimeFactors.size(); ++i) + for (uint64_t i = 0; i < noOfPrimeFactors.size(); ++i) for (int j = 0; j < noOfPrimeFactors[i]; ++j) primeFactors.push_back(primes[i]); return std::accumulate(primeFactors.begin(), primeFactors.end(), 1, EulerUtility::multiply); -}- No newline at end of file +} diff --git a/Euler_51.cpp b/Euler_51.cpp @@ -20,7 +20,7 @@ int Euler::PrimeDigitReplacements() int repeatedDigits[3] = {0, 0, 0}; - for (int i = 0; i < digits.size() - 1; ++i) + for (uint64_t i = 0; i < digits.size() - 1; ++i) if (digits[i] <= 2) ++repeatedDigits[digits[i]]; @@ -41,7 +41,7 @@ int Euler::PrimeDigitReplacements() std::vector<int> indices; int sizeOfFamily = 1; - for (int i = 0; i < digits.size() - 1; ++i) + for (uint64_t i = 0; i < digits.size() - 1; ++i) if (digits[i] == p.digit) indices.push_back(i); @@ -62,4 +62,4 @@ int Euler::PrimeDigitReplacements() } return 0; -}- No newline at end of file +} diff --git a/Euler_53.cpp b/Euler_53.cpp @@ -1,13 +0,0 @@ -#include "Euler.h" - -int Euler::CombinatoricSelections() -{ - int total = 0; - - for (int i = 1; i <= 100; ++i) - for (int j = 1; j <= i; ++j) - if (EulerUtility::choose(i, j) > 1000000) - ++total; - - return total; -}- No newline at end of file diff --git a/Euler_54.cpp b/Euler_54.cpp @@ -1,4 +1,5 @@ #include <algorithm> +#include <cstdint> #include <fstream> #include <functional> #include <unordered_set> @@ -22,7 +23,7 @@ bool isFlush(std::vector<std::string>& hand) { char c = hand[0][1]; - for (int i = 1; i < hand.size(); ++i) + for (uint64_t i = 1; i < hand.size(); ++i) if (hand[i][1] != c) return false; @@ -31,7 +32,7 @@ bool isFlush(std::vector<std::string>& hand) bool isStraight(std::vector<int> indices) { - for (int i = 1; i < indices.size(); ++i) + for (uint64_t i = 1; i < indices.size(); ++i) if (indices[i] != indices[i - 1] - 1) return false; @@ -42,7 +43,7 @@ std::vector<int> getCardValues(std::vector<std::string>& hand) { std::vector<int> indices; - for (int i = 0; i < hand.size(); ++i) + for (uint64_t i = 0; i < hand.size(); ++i) { for (int j = 0; j < 13; ++j) { char c = hand[i][0]; @@ -52,10 +53,11 @@ std::vector<int> getCardValues(std::vector<std::string>& hand) break; } } + } - std::sort(indices.begin(), indices.end(), std::greater<int>()); + std::sort(indices.begin(), indices.end(), std::greater<int>()); - return indices; + return indices; } int determineNoOfRepeats(std::unordered_set<int>& us, std::vector<int>& cardValues, int t, int def, int high) @@ -64,7 +66,7 @@ int determineNoOfRepeats(std::unordered_set<int>& us, std::vector<int>& cardValu { int total = 0; - for (int k = 0; k < cardValues.size(); ++k) + for (uint64_t k = 0; k < cardValues.size(); ++k) if (j == cardValues[k]) ++total; @@ -81,7 +83,7 @@ int determineRepeat(std::unordered_set<int>& us, std::vector<int>& cardValues, i { int total = 0; - for (int k = 0; k < cardValues.size(); ++k) + for (uint64_t k = 0; k < cardValues.size(); ++k) if (j == cardValues[k]) ++total; @@ -110,9 +112,10 @@ void determinePriorityOrder(hand& h, std::unordered_set<int>& us) case 1: rep1 = determineRepeat(us, h.cardValues, 2, false); - for (int i = 0; i < h.cardValues.size(); ++i) + for (uint64_t i = 0; i < h.cardValues.size(); ++i) { if (h.cardValues[i] == rep1) std::swap(h.cardValues[no++], h.cardValues[i]); + } std::sort(h.cardValues.begin() + 2, h.cardValues.end(), std::greater<int>()); break; @@ -123,28 +126,29 @@ void determinePriorityOrder(hand& h, std::unordered_set<int>& us) if (rep2 > rep1) std::swap(rep1, rep2); - for (int i = 0; i < h.cardValues.size(); ++i) + for (uint64_t i = 0; i < h.cardValues.size(); ++i) { if (h.cardValues[i] == rep1) std::swap(h.cardValues[no++], h.cardValues[i]); } - for (int i = 0; i < h.cardValues.size(); ++i) + for (uint64_t i = 0; i < h.cardValues.size(); ++i) if (h.cardValues[i] == rep2) std::swap(h.cardValues[no++], h.cardValues[i]); break; case 3: rep1 = determineRepeat(us, h.cardValues, 3, false); - for (int i = 0; i < h.cardValues.size(); ++i) + for (uint64_t i = 0; i < h.cardValues.size(); ++i) { if (h.cardValues[i] == rep1) std::swap(h.cardValues[no++], h.cardValues[i]); + } std::sort(h.cardValues.begin() + 3, h.cardValues.end(), std::greater<int>()); break; case 6: rep1 = determineRepeat(us, h.cardValues, 3, false); - for (int i = 0; i < h.cardValues.size(); ++i) + for (uint64_t i = 0; i < h.cardValues.size(); ++i) if (h.cardValues[i] == rep1) std::swap(h.cardValues[no++], h.cardValues[i]); @@ -152,7 +156,7 @@ void determinePriorityOrder(hand& h, std::unordered_set<int>& us) case 7: rep1 = determineRepeat(us, h.cardValues, 4, false); - for (int i = 0; i < h.cardValues.size(); ++i) + for (uint64_t i = 0; i < h.cardValues.size(); ++i) if (h.cardValues[i] == rep1) std::swap(h.cardValues[no++], h.cardValues[i]); break; @@ -216,7 +220,7 @@ bool determineWinner(game g) //assumes no draws if (g.hands[1].handValue > g.hands[0].handValue) return true; - for (int i = 0; i < g.hands[0].cardValues.size(); ++i) + for (uint64_t i = 0; i < g.hands[0].cardValues.size(); ++i) { if (g.hands[0].cardValues[i] > g.hands[1].cardValues[i]) return false; @@ -234,12 +238,13 @@ int Euler::PokerHands() std::ifstream fin; fin.open("E:\Euler Resources\Euler 54.txt"); - int idx = 0; - for (std::string line; std::getline(fin, line);) - ++scores[determineWinner(determineHands(EulerUtility::strTokenizer(line, ' ')))]; + for (std::string line; std::getline(fin, line);) { + std::vector<std::string> tokens = EulerUtility::strTokenizer(line, ' '); + ++scores[determineWinner(determineHands(tokens))]; + } fin.close(); return scores[0]; -}- No newline at end of file +} diff --git a/Euler_64.cpp b/Euler_64.cpp @@ -49,7 +49,7 @@ int period(int n) { - double n2 = std::sqrtl(n); + double n2 = sqrtl(n); int a = n2, p = 0, q = 1, length = 0; do @@ -81,4 +81,4 @@ int Euler::OddPeriodSquareRoots() } return odds; -}- No newline at end of file +} diff --git a/Euler_7.cpp b/Euler_7.cpp @@ -2,8 +2,6 @@ int Euler::Get10001stPrime() { - int noOfPrimes = 0; - bool is_prime; int count = 2; //includes 2 & 3 diff --git a/Euler_74.cpp b/Euler_74.cpp @@ -3,7 +3,7 @@ #include "Euler.h" -int recurseChain(llui head, std::set<llui> &chain, int factorials[], int size) +int recurseChain(llui head, std::set<llui> &chain, int factorials[], uint64_t size) { llui tempHead = head; llui newHead = 0; @@ -41,7 +41,7 @@ int Euler::DigitFactorialChains() std::vector<std::vector<int>> solutions; - for (int i = 1; i < 1e6; ++i) + for (uint64_t i = 1; i < 1e6; ++i) { bool ordered = true; @@ -90,4 +90,4 @@ int Euler::DigitFactorialChains() } return total; -}- No newline at end of file +} diff --git a/Euler_75.cpp b/Euler_75.cpp @@ -4,7 +4,7 @@ int Euler::UniquePerimeterRightAngledTriangles() { - int ceiling = 1500000; + llui ceiling = 1500000; double sqrtCeiling = sqrt(ceiling); std::vector<int> perimeters(ceiling + 1, 0); @@ -36,4 +36,4 @@ int Euler::UniquePerimeterRightAngledTriangles() } return std::count(perimeters.begin(), perimeters.end(), 1); -}- No newline at end of file +} diff --git a/Euler_76.cpp b/Euler_76.cpp @@ -3,6 +3,7 @@ ll partition(int n, std::vector<int> &cache) { ll p = 0; + std::vector<int> cache_ref = cache; if(n >= 0) { @@ -10,9 +11,9 @@ ll partition(int n, std::vector<int> &cache) { return 1; } - if(cache[n - 1] != 0) + if(cache_ref[n - 1] != 0) { - return cache[n - 1]; + return cache_ref[n - 1]; } int k = 1; @@ -27,12 +28,12 @@ ll partition(int n, std::vector<int> &cache) int sign = (k - 1) & 1 ? -1 : 1; - p += sign * partition(n - s1, cache); - p += sign * partition(n - s2, cache); + p += sign * partition(n - s1, cache_ref); + p += sign * partition(n - s2, cache_ref); ++k; } - cache[n - 1] = p; + cache_ref[n - 1] = p; } return p; @@ -40,5 +41,6 @@ ll partition(int n, std::vector<int> &cache) int Euler::CountingSums() { - return partition(100, std::vector<int>(100, 0)) - 1; -}- No newline at end of file + std::vector<int> cache(100, 0); + return partition(100, cache) - 1; +} diff --git a/Euler_77.cpp b/Euler_77.cpp @@ -1,10 +1,13 @@ +#include <algorithm> +#include <cstdint> + #include "Euler.h" int primeSumRecurse(int n, int max, std::vector<int> &primes) { int sum = 0; - for(int i = max; i < primes.size(); i++) + for(uint64_t i = max; i < primes.size(); i++) { if (n - primes[i] == 0) ++sum; @@ -31,4 +34,4 @@ int Euler::PrimeSummations() } return i; -}- No newline at end of file +} diff --git a/Euler_79.cpp b/Euler_79.cpp @@ -1,3 +1,4 @@ +#include <algorithm> #include <fstream> #include <set> @@ -38,4 +39,4 @@ std::string Euler::PasscodeDerivation() } return passcode; -}- No newline at end of file +} diff --git a/bigint/Euler_43.cpp b/bigint/Euler_43.cpp @@ -46,7 +46,7 @@ BigInteger Euler::SubStringDivisibility() BigInteger i = 0; - for (unsigned long ul : divisiblePermutations) + for (uint64_t ul : divisiblePermutations) i += ul; return i; diff --git a/bigint/Euler_53.cpp b/bigint/Euler_53.cpp @@ -0,0 +1,15 @@ +#include <cstdint> + +#include "Euler.h" + +int Euler::CombinatoricSelections() +{ + int total = 0; + + for (int i = 1; i <= 100; ++i) + for (int j = 1; j <= i; ++j) + if (EulerUtility::choose(i, j) > 1000000) + ++total; + + return total; +} diff --git a/main.cpp b/main.cpp @@ -7,21 +7,21 @@ int main() { Euler e; std::clock_t start = std::clock(); - //std::cout << e.SumOfMultiplesOf3And5Ceiling1000() << std::endl; - //std::cout << e.SumOfEvenFibonacciNumbersCeiling4m() << std::endl; - //std::cout << e.LargestPrimeFactor() << std::endl; - //std::cout << e.LargestPalindromeFrom3DigitProduct() << std::endl; - //std::cout << e.DivisibleBy1To20() << std::endl; - //std::cout << e.DifferenceSumOfSquaresSquareOfSum100() << std::endl; - //std::cout << e.Get10001stPrime() << std::endl; - //std::cout << e.FindGreatestProductOf13AdjacentDigits() << std::endl; - //std::cout << e.SpecialPythagoreanTriplet() << std::endl; - //std::cout << e.SumOfPrimesUnder2m() << std::endl; + std::cout << e.SumOfMultiplesOf3And5Ceiling1000() << std::endl; + std::cout << e.SumOfEvenFibonacciNumbersCeiling4m() << std::endl; + std::cout << e.LargestPrimeFactor() << std::endl; + std::cout << e.LargestPalindromeFrom3DigitProduct() << std::endl; + std::cout << e.DivisibleBy1To20() << std::endl; + std::cout << e.DifferenceSumOfSquaresSquareOfSum100() << std::endl; + std::cout << e.Get10001stPrime() << std::endl; + std::cout << e.FindGreatestProductOf13AdjacentDigits() << std::endl; + std::cout << e.SpecialPythagoreanTriplet() << std::endl; + std::cout << e.SumOfPrimesUnder2m() << std::endl; //std::cout << e.LargestProductInGrid() << std::endl; //std::cout << e.TriangleNoWithGreaterThan500Divisors() << std::endl; //std::cout << e.LargeSum() << std::endl; //std::cout << e.CollatzConjecture() << std::endl; - std::cout << e.LatticePaths() << std::endl; + //std::cout << e.LatticePaths() << std::endl; //std::cout << e.DigitSum() << std::endl; //std::cout << e.LetterCounter() << std::endl; //std::cout << e.MaximumPathSum() << std::endl; @@ -88,6 +88,5 @@ int main() { //std::cout << e.SquareRootDigitalExpansion() << std::endl; std::cout << "duration: " << std::clock() - start << "ms" << std::endl; - - std::cin.get(); + return 0; }