-1

非常に単純な質問: 結果ではなく手順が必要です。

背景: 私は非常に大きな数を取り、それらを配列に格納しています。次に、2 つを加算または減算します。配列なので、列ごとに行う必要があります。追加を行いました。しかし、私の人生では、小さい数から大きい数を引くときに何をすべきかを理解/覚えることができません。

この質問を列ごとに解決する手順は何ですか?

   50
 -500
 -----

編集: それらは int[] に格納されます。割り当て要件であるため、配列を使用します。列ごとの減算のロジックを理解する必要があるだけです。

4

3 に答える 3

1

数値を数字の配列として表していると思います。したがって、たとえば、50 は [5, 0] (または、より便利には [0, 5]) で表されます。また、負の数を表す何らかの方法があると仮定します (減算に必要です)。

小さい数値から大きい数値を引くには、いくつかのオプションがあります。

  • 減算の順序を逆にして、結果を否定する
  • 減算を否定し、2 つの数値を加算して結果を取得します。

後者のオプションは、加算アルゴリズムが混合符号の引数に対して機能し、被減数と被減数の大きさに関係なく機能することを前提としています。どちらのオプションも、数値を否定するアルゴリズムがあることを前提としています。

負の数を表す手段がない場合は、50 - 500 を計算するように求められたときに失敗を知らせるしかありません (結果を表す方法がないため)。

于 2013-01-25T18:48:12.273 に答える
0

次の仮定で行く:

  • 500 は [5,0,0] として表されます。
  • 被減数はmi
  • 減数はsu

次のアルゴリズムを使用して、整数の 2 つの配列を減算できます。

  1. と比較mi.lengthするsu.length
  2. if mi.length< su.lengththen をスワップしarray、2 つの配列間で減算した後 (最後の index から0thindex に移動する列ごとの減算を行う)、結果を無効にします。
  3. mi.length==の場合su.length、mi ( mi[i]) のインデックス i の要素と su ( su[i]) のインデックス i の要素の比較を開始します。miより小さいことが判明した場合はsr、 を交換しarrayます。2 つの配列間の減算の後、結果を否定します。
  4. if mi.length > su.lengththen は、2 つの配列間で通常の減算を実行するだけです。

足し算と引き算の完全なコードを次に示します。

//Assumed that none of number represented by array is LPaded by "0s" and the initegers at other than 0th position is not negative.
public class BigNumberAddSubtract
{
    private int array1[];
    private int array2[];
    private boolean shouldBeNegative = false;
    public BigNumberAddSubtract(int[] iArray1, int[] iArray2)
    {
        array1 = iArray1;
        array2 = iArray2;
    }
    public void setArray1(int[] array)
    {
        this.array1 = array;
    }
    public void setArray2(int[] array)
    {
        this.array2 = array;
    }
    //Subtraction 
    private int[] subtract()
    {
        int length1 = array1.length;
        int length2 = array2.length;
        boolean isMinus = false;
        int mi[] = array1 ;//Minuend
        int su[] = array2 ;//Subtrahend
        boolean isPrevEqual = false;
        boolean isFirstNegative = false;
        if (length1 == length2 )                
        {   
            if (array1[0] < 0 )
            {
                isFirstNegative = true;
            }
            for (int i =0 ; i < length1 ; i++)
            {
                if (Math.abs(array1[i]) == Math.abs(array2[i]))    
                {                                                  
                    isPrevEqual = true;
                    continue;
                }
                else if (array1[i] < array2[i])
                {
                    if (isPrevEqual)
                    {
                        isMinus = true;
                        System.out.println("breaking");
                        break;
                    }
                }
                else
                {
                    isPrevEqual = false;
                }
            }
        }
        else if (length1 < length2) 
        {                           
            if (array1[0] < 0)
            {
                isFirstNegative = true;
            }
            isMinus = true; 
        }
        else
        {
            if (array1[0] < 0 )
            {                                                                 
                isFirstNegative = true;
            }
        }
        array1[0] = Math.abs(array1[0]);
        array2[0] = Math.abs(array2[0]);
        if (isMinus)
        {
            mi = array2;
            su = array1;
        }
        int[] result = new int[mi.length];
        int iCursor1 = mi.length - 1;
        int iCursor2 = su.length - 1;
        int iCarry = 0;
        for (int i=result.length - 1 ; i >= 0 ; i--, iCursor1--, iCursor2--)
        {
            int iValue = 0;
            int iFrom =  0;
            iFrom = mi[iCursor1] - iCarry;                  
            if (iFrom < (iCursor2 < 0 ? 0 : su[iCursor2]))
            {
                if (iCursor1 > 0)
                {
                    iFrom = 10 + iFrom;
                }
                iCarry = 1;
            }
            else
            {
                iCarry = 0;
            }
            iValue = iFrom - (iCursor2 < 0 ? 0 : su[iCursor2]) ;      
            result[i] = iValue;                                       
        }
        int[] temp = null;
        if (isMinus)
        {
            int counter = 0;
            for (int i=0; i < result.length; i++)
            {
                if (result[i] == 0)
                {
                    counter++ ;
                    continue;
                }
                else
                {
                    result[i] = -result[i];
                    break;
                }
            }
            temp = new int[result.length - counter];
            System.arraycopy(result,counter,temp,0,result.length - counter);
            result = new int[temp.length];
            System.arraycopy(temp,0,result,0,temp.length);
        }
        if (isFirstNegative)
        {
            int counter = 0;
            for (int i=0; i < result.length; i++)
            {
                if (result[i] == 0)
                {
                    counter++ ;
                    continue;
                }
                else
                {
                    result[i] = -result[i];
                    break;
                }
            }
            temp = new int[result.length - counter];
            System.arraycopy(result,counter,temp,0,result.length - counter);
            result = new int[temp.length];
            System.arraycopy(temp,0,result,0,temp.length);
        }
        return result;
    }
    //Addition
    private int[] add()
    {
        int length1 = array1.length;
        int length2 = array2.length;
        int[] result = new int[length1 > length2 ? length1 : length2];
        int iCursor1 = array1.length - 1;
        int iCursor2 = array2.length - 1;
        int iCarry = 0;
        array1[0] = Math.abs(array1[0]);
        array2[0] = Math.abs(array2[0]);
        for (int i=result.length - 1 ; i >= 0 ; i--, iCursor1--, iCursor2--)
        {
            int iValue = 0;
            if (iCursor1 >= 0 && iCursor2 >= 0)
            {
                iValue = array1[iCursor1]  + array2[iCursor2] + iCarry;
            }
            else if (iCursor1 < 0 && iCursor2 >=0)
            {
                iValue = array2[iCursor2] + iCarry;
            }
            else if (iCursor1 >=0 && iCursor2 < 0)
            {
                iValue = array1[iCursor1] + iCarry;
            }
            if (iCursor1 == 0 && iCursor2 ==0)
            {
                result[i] = iValue;
                iCarry = 0;
            }
            else
            {
                result[i] = iValue % 10;            
                iCarry = iValue / 10;               
            }
        }
        result[0] = result[0] + iCarry;
        if (shouldBeNegative)
        {
            result[0] = -result[0];
        }
        return result;
    }
    public int[] performOperation()
    {
        if (array1[0] < 0 && array2[0] < 0)//If digit at one's place of both number is negative
        {
            shouldBeNegative = true;
            return add();
        }
        else if (array1[0] > 0 && array2[0] > 0)
        {
            return add();
        }
        else //if digit at one's place of one of the numbers is negative
        {
            return subtract();
        }
    }
    public static void main(String[] st)
    {
        int[] arr1 ={-9,0,0,6};
        int[] arr2 = {1,9,7,8};
        BigNumberAddSubtract big = new BigNumberAddSubtract(arr1,arr2);
        int[] addResult = big.performOperation();
        for (int i : addResult )
        {
            System.out.print(i);
        }
    }
}

テストが失敗したり、矛盾が見つかった場合は、お知らせください。

于 2013-01-25T22:46:03.643 に答える
-1

私はあなたの質問を完全に理解しているとは思えませんが、ここに答えがあります:

[私] = 50 - 500;

編集:最初に述べたように、それはあなたの質問から完全に不明確でした。あなたが述べたこととは逆の順序で数字を保存するので、インデックス0は常に「1」の位置、インデックス1は常に「10」の位置などになります。それらすべてをカバーし、配列の末尾を超えるアクセスをその位置のゼロ値として扱います。指定した順序で数字を格納できますが、ループ ロジックが少し複雑になります。

于 2013-01-25T18:37:33.443 に答える