rsant023
rsant023

Reputation: 25

Addition of two very long integers

For practice, I am trying to add two very long integers by placing them in arrays and adding the corresponding elements in the arrays. However, when trying to add the carry over, I'm having problems (I.e., the carry over is the 1, that for instance, you add to the tens place when you do 199 + 199 = 398).

When doing 167 + 189 I get the right answer which is 356. However, for this very example though (199 + 199), I'm getting 288 instead of 398. My question is, why do I get an incorrect answer when I do 199 + 199, if the carry over works well when I do 167 + 189?

if (stringNumOneLength == stringNumTwoLength)
    {   int answer; 
        int carryOver = 0;
        int answerArray[] = new int[stringNumOneLength + 1];
        for (int i = 1; i <= stringNumTwoLength; i = i + 1)
        {            
            answer = Character.getNumericValue(stringNumOne.charAt(stringNumOneLength - i)) + Character.getNumericValue(stringNumTwo.charAt(stringNumTwoLength - i) + carryOver);
            System.out.println(answer);
            if (answer >= 10)
            {
                for (int j = 0; j <= 9; j = j + 1)
                {
                    if (10 + j == answer) 
                    {
                        carryOver = 1;
                        answer = j;
                        System.out.println("The carryover is " + carryOver + ".");
                    }
                }
            }
            else
            {
                carryOver = 0;
            }

            answerArray[stringNumOneLength + 1 - i] = answer;
        }
        System.out.println(Arrays.toString(answerArray));
    }

The output is the following:

[1, 9, 9]

[1, 9, 9]

18

The carryover is 1.

8

2

[0, 2, 8, 8]

Upvotes: 0

Views: 692

Answers (2)

Gene
Gene

Reputation: 46960

You're adding the carry to the character rather than to its value:

 ... + Character.getNumericValue(stringNumTwo.charAt(stringNumTwoLength - i) + carryOver);

You want to move the right parent inside the +.

Note your for loop is unnecessary. This does the same thing:

if (answer >= 10)
{
    answer -= 10;
    carryOver = 1;
    System.out.println("The carryover is 1.");
}
else ...

In case you're interested in an idiomatic solution:

public class Test {

    public String add(String a, String b) {
        StringBuilder r = new StringBuilder();
        int carry = 0;
        for (int ia = a.length() - 1, ib = b.length() - 1; ia >= 0 || ib >= 0; ia--, ib--) {
            int aDigit = ia < 0 ? 0 : Character.getNumericValue(a.charAt(ia));
            int bDigit = ib < 0 ? 0 : Character.getNumericValue(b.charAt(ib));
            int sum = carry + aDigit + bDigit;
            if (sum >= 10) {
                sum -= 10;
                carry = 1;
            }
            else {
                carry = 0;
            }
            r.append(Character.forDigit(sum, 10));
        }
        if (carry > 0) {
            r.append('1');
        }
        return r.reverse().toString();
    }

    public void run() {
        System.out.println("789 + 89 = " + add("789", "89"));
        System.out.println("12 + 128 = " + add("12", "128"));
        System.out.println("999 + 999 = " + add("999", "999"));
    }

    public static void main(String[] args) {
        new Test().run();
    }
}

Upvotes: 2

Yexo
Yexo

Reputation: 1885

The parenthesis on this line:

answer = Character.getNumericValue(stringNumOne.charAt(stringNumOneLength - i)) + Character.getNumericValue(stringNumTwo.charAt(stringNumTwoLength - i) + carryOver);

are wrong. Notice how the + carryOver is within the call to Character.getNumericValue.

Upvotes: 1

Related Questions