void primeFactorization(const bignum &bn, vector<bignum> &factors) { if (bn.getDecimalCount() > 0) throw error_handler(__FILE__, __LINE__, "Cannot find the prime factorization of a decimal"); //converts to base 10 first for faster prime checks, then converts base of all prime factors in the list if (bn.getBase() != 10) { bignum converted(bn); converted.convertBase(10); primeFactorization(converted, factors); for (vector<bignum>::iterator i = factors.begin(); i != factors.end(); i++) i->convertBase(bn.getBase()); return; } if (bn < 0) { factors.push_back(-1); if (bn.absolute().isPrime()) { factors.push_back(bn.absolute()); return; } else return primeFactorization(bn.absolute(), factors); } if (bn.isPrime()) { factors.push_back(1); factors.push_back(bn); return; } bignum temp(2); while (bn % temp != 0) temp++; if (!(bn / temp).isPrime()) primeFactorization(bn / temp, factors); else factors.push_back(bn / temp); if (!temp.isPrime()) primeFactorization(temp, factors); else factors.push_back(temp); }
/* solve the problem */ int main (int argc, char *argv[]) { int elements[MAX_SIZE]; int primes[MAX_PRIMES], instancesCount[MAX_PRIMES], primesUsed[MAX_PRIMES]; int maxPrimeDefined, primesUsedCount; int numberOfDivisors, loop; #ifdef debug_on printf("\nP25 - Brave Balloonists:\n"); #endif primes[0] = 2; primes[1] = 3; /* necessary to be defined for currentPrime+=2 logic to work */ maxPrimeDefined = 1; primesUsedCount = 0; /* read program arguments */ for (loop=0; loop<MAX_SIZE; loop++) { scanf("%d", &elements[loop]); primeFactorization(elements[loop],primes,instancesCount,primesUsed,&maxPrimeDefined,&primesUsedCount); } #ifdef debug_on printArgs(elements); printf("\nProblem Solution:\n"); #endif /* solution */ numberOfDivisors = 1; for (loop=0; loop<primesUsedCount; loop++) { numberOfDivisors = numberOfDivisors * (instancesCount[primesUsed[loop]] + 1); } #ifdef debug_on printf("result: %d MOD 10 = ", numberOfDivisors); #endif printf("%d\n",numberOfDivisors%10); #ifdef debug_on printf("\n--------------------\n"); #endif return 0; }