diff --git a/projecteuler/080/main.cpp b/projecteuler/080/main.cpp new file mode 100644 index 0000000..9c0ae47 --- /dev/null +++ b/projecteuler/080/main.cpp @@ -0,0 +1,95 @@ +#include +#include "../bigint.h" + +using namespace std; + +// This function should only work on positive integer n +int rootDigitSum(unsigned int n, int decimals=99){ + + // Integer roots don't have decimals of course + int check = sqrt(n); + if(check * check == n){ + return 0; + } + + int result = check; + vector digits; + + while(n > 0){ + int last = n % 10; + n /= 10; + + digits.push_back(last); + } + + // Initialize method + InfInt remainder; + if(digits.size() % 2 == 0){ + remainder = 10 * digits.back(); + digits.pop_back(); + remainder += digits.back(); + digits.pop_back(); + } else{ + remainder = digits.back(); + digits.pop_back(); + } + + InfInt minus = remainder.intSqrt(); + InfInt root = minus; + remainder -= minus * minus; + + while(decimals != 0){ + // cout << remainder << " " << root << endl; + remainder *= 100; + + bool decimalPart = true; + if(!digits.empty()){ + decimalPart = false; + + remainder += digits.back() * 10; + digits.pop_back(); + remainder += digits.back(); + digits.pop_back(); + } + + for(int guess = 0; guess < 10; ++guess){ + InfInt lower = (root * 20 + guess) * guess; + InfInt upper = (root * 20 + guess + 1) * (guess + 1); + + if(lower <= remainder && remainder < upper){ + remainder -= lower; + root = root * 10 + guess; + + if(decimalPart) result += guess; + + // cout << remainder << " " << root << " " << lower << " " << upper << endl; + + break; + } + } + + --decimals; + } + + return result; +} + +int main(){ + + cout << "Hello this is Patrick" << endl; + auto start = chrono::high_resolution_clock::now(); + + int result = 0; + + for(int i = 1; i <= 100; ++i){ + result += rootDigitSum(i); + } + + cout << result << endl; + + // cout << rootDigitSum(2) << endl; + + auto duration = chrono::duration_cast(chrono::high_resolution_clock::now() - start); + cout << (float)duration.count()/1000 << endl; + return 0; +}