Project Euler : Adding 100 50-Digit Numbers

The problem number 13 asked to find the first 1o digits of the sum of 100 50-digit numbers. Well, it was a pretty straight forward task. I think the purpose of this problem was to build an adder to add any large numbers. So I created a new class called BigNumber which stores the numbers as an arraylist of integers.

Here is my code:

public class Problem_13 {
	private static int s_numberOfDataRows = 100;

	public String addNumbers() throws IOException {
		BigNumber[] numbers = readNumbersFromFile();
		return BigNumber.add(50, numbers).toString();
	}

	private BigNumber[] readNumbersFromFile() throws IOException {
		String fileName = "problem_13.in";
		BigNumber[] numbers = new BigNumber[Problem_13.s_numberOfDataRows];

		BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(fileName)));
		for (int i = 0; i < Problem_13.s_numberOfDataRows; i++)
			numbers[i] = new BigNumber(bufferedReader.readLine());

		return numbers;
	}

	public static void main(String[] args) throws IOException {
		System.out.println(new Problem_13().addNumbers());
	}
}

class BigNumber {
	ArrayList<Integer> m_digits;

	public BigNumber(String number) {
		int lengthOfNumber = number.length();
		m_digits = new ArrayList<Integer>(lengthOfNumber);
		for (int i = lengthOfNumber - 1; i >= 0; i--)
			m_digits.add(number.charAt(i) - '0');
	}

	public BigNumber(int sizeOfBigNumber) {
		m_digits = new ArrayList<Integer>(sizeOfBigNumber);
	}

	public int getDigitAtIndex(int index) {
		return index < m_digits.size() ? m_digits.get(index) : 0;
	}

	public void insertDigit(int position, int digit) {
		m_digits.add(position, digit);
	}

	public String toString() {
		int size = m_digits.size();
		StringBuffer number = new StringBuffer(size);
		for (int i = 0; i < size; i++)
			number.insert(0, getDigitAtIndex(i));

		return number.toString();
	}

	public static BigNumber add(int maxLength, BigNumber... numbers) {
		BigNumber sum = new BigNumber(maxLength);

		int carry = 0;
		for (int i = 0; i < maxLength; i++) {
			int partialSum = carry;
			for (BigNumber number : numbers)
				partialSum += number.getDigitAtIndex(i);
			sum.insertDigit(i, partialSum % 10);
			carry = partialSum / 10;
		}

		if (carry != 0)
			sum.insertDigit(maxLength, carry);

		return sum;
	}
}

Popularity: 14% [?]

Related posts:

  1. Project Euler : Numbers That Are Fifth Powers Of Their Digits
  2. Project Euler : Sum Total Of All Name Scores
  3. Project Euler : Verifying Triangle Words
  4. Project Euler : Greatest Product of 4 Numbers In A 20×20 Grid
  5. Project Euler : Palindrome Made From Product Of Three Digit Numbers