簡體   English   中英

兩個非常長的整數相加

[英]Addition of two very long integers

為了練習,我試圖通過將兩個非常長的整數放置在數組中並在數組中添加相應的元素來添加它們。 但是,當嘗試添加結轉時,我遇到了問題(即,結轉為1,例如,當您執行199 + 199 = 398時,您將其加到十位)。

當執行167 + 189時,我得到正確的答案是356。但是,對於這個示例(199 + 199),我得到的是288,而不是398。我的問題是,為什么我這樣做時會得到錯誤的答案199 + 199,如果我做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));
    }

輸出如下:

[1、9、9]

[1、9、9]

18歲

結轉為1。

8

2

[0,2,8,8]

您正在將進位加到角色而不是其值上:

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

您想在+內移動右父級。

注意您的for循環是不必要的。 這做同樣的事情:

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

如果您對慣用的解決方案感興趣:

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();
    }
}

這行的括號是:

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

錯了。 請注意,在對Character.getNumericValue的調用中,如何使用+ carryOver

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM