#include #include "Spigot.hpp" Spigot::Spigot(int requestedNumDigits) { /* create list for number of digits times 10 / 3 */ this->spigotListLength = (requestedNumDigits * 10) / 3; this->spigotList.resize(this->spigotListLength, 2); // list is initialized with all 2 this->carry = 0; return; } void Spigot::pump(void) { int tempPreDigit = 0; int i = this->spigotListLength - 1; while(i >= 0) { this->spigotList[i] *= 10; i--; } this->carry = 0; i = this->spigotListLength - 1; // note this does *not* handle the i=0 case while(i > 0) { this->spigotList[i] += this->carry; this->carry = (this->spigotList[i] / (i * 2 + 1)) * i; this->spigotList[i] = this->spigotList[i] % (i * 2 + 1); i--; } // special case of i = 0 this->spigotList[0] += this->carry; tempPreDigit = this->spigotList[0] // 10; this->spigotList[0] -= (tempPreDigit * 10); // handle the cases depending on the tempPreDigit if(tempPreDigit >= 0 && tempPreDigit <= 8) { // output all predigits for(long unsigned int j = 0; j < this->preDigits.size(); j++) { std::cout << this->preDigits.back(); this->preDigits.pop_back(); } this->preDigits.insert(this->preDigits.begin(), tempPreDigit); } else if(tempPreDigit == 9) { this->preDigits.insert(this->preDigits.begin(), tempPreDigit); } else if(tempPreDigit == 10) { tempPreDigit = 0; for(long unsigned int j = 0; j < this->preDigits.size(); j++) { std::cout << (this->preDigits.back() + 1) % 10; this->preDigits.pop_back(); } this->preDigits.insert(this->preDigits.begin(), tempPreDigit); } else { std::cout << "We should never have gotten here -- shit has hit the fan!" << std::endl; } return; }