int digSumNum ( InfInt a, InfInt b ) { if ( b > a ) a = b; int sum = 0; for ( char i = 0; i < a.numberOfDigits(); i ++ ) sum += a.digitAt ( i ); return sum; }
void simpleEuler20::calculateFactorial() { InfInt sum = "1"; for (int i = max; i > 0; i--) { sum = sum * i; } sumOfNumbers(sum.toString()); }
InfInt InfInt::operator*(ELEM_TYPE rhs) const {//PROFILED_SCOPE InfInt result = *this; ELEM_TYPE factor = rhs < 0 ? -rhs : rhs; multiplyByDigit(factor, result.val); result.correct(); result.pos = (result.val.size() == 1 && result.val[0] == 0) ? true : (pos == (rhs >= 0)); return result; }
InfInt InfInt::operator-(const InfInt& rhs) const {//PROFILED_SCOPE InfInt result; result.val.resize(val.size() > rhs.val.size() ? val.size() : rhs.val.size(), 0); for (size_t i = 0; i < val.size() || i < rhs.val.size(); ++i) { result.val[i] = (i < val.size() ? (pos ? val[i] : -val[i]) : 0) - (i < rhs.val.size() ? (rhs.pos ? rhs.val[i] : -rhs.val[i]) : 0); } result.correct(); return result; }
InfInt InfInt::operator*(const InfInt& rhs) const {//PROFILED_SCOPE InfInt result; result.val.resize(val.size() + rhs.val.size(), 0); PRODUCT_TYPE carry = 0; size_t digit = 0; for (;; ++digit) {//PROFILED_SCOPE //result.val[digit] = (ELEM_TYPE) (carry % BASE); //carry /= BASE; PRODUCT_TYPE oldcarry = carry; carry /= BASE; result.val[digit] = (ELEM_TYPE)(oldcarry - carry * BASE); bool found = false; for (size_t i = digit < rhs.val.size() ? 0 : digit - rhs.val.size() + 1; i < val.size() && i <= digit; ++i) {//PROFILED_SCOPE PRODUCT_TYPE pval = result.val[digit] + val[i] * (PRODUCT_TYPE)rhs.val[digit - i]; if (pval >= BASE || pval <= -BASE) {//PROFILED_SCOPE //carry += pval / BASE; //pval %= BASE; PRODUCT_TYPE quot = pval / BASE; carry += quot; pval -= quot * BASE; } result.val[digit] = (ELEM_TYPE)pval; found = true; } if (!found) {//PROFILED_SCOPE break; } } for (; carry > 0; ++digit) {//PROFILED_SCOPE result.val[digit] = (ELEM_TYPE)(carry % BASE); carry /= BASE; } result.correct(); result.pos = (result.val.size() == 1 && result.val[0] == 0) ? true : (pos == rhs.pos); return result; }
vector<InfInt> trial_division_primes(InfInt n) { InfInt sqrt_n = n.intSqrt(); vector<InfInt> divizori; InfInt i = 2; if (n % i == 0) { divizori.push_back(i); } i = 3; while (i <= sqrt_n) { if ((n % i) == 0) { divizori.push_back(i); } i+=2; } return divizori; }
InfInt digitSum(const InfInt n) { int retval=0; for(unsigned int i=0;i<n.numberOfDigits();++i) retval+=n.digitAt(i); return retval; }