示例#1
0
	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;
}