高精度「-」アルゴリズム

1647 ワード

一、高精度「-」アルゴリズム
1.1高精度「-」を作成し、次の内容を覚えておくと、コードに余裕があります!
(1)まず高精度"+"と同様の処理方式で大きな整数を格納する
(2)次に記憶が完了したら,どのように演算するかを考える.
二、高精度「-」アルゴリズムの核心
2.1大整数ストレージ
•'+'-'*'/'のどちらを作成しても、大きな整数の格納フォーマットが同じであることを保証する必要があります.多くの場合、1つのシンボルだけの演算がないためです.
2.2減算の本質
•大整数相減算:C=A 3 A 2 A 1 A 0-B 2 B 1 B 0、2つのケースに分けて考えると、Ai-Bi-tが十分に減算されていれば、最終的なビット数はAi-Bi-t、十分に減算されていなければ、最終的なビット数はAi-Bi-t+10、実際には(t+10)%10の2つのケースです.
2.3その他に
(1)配列の中にある2つの大きな整数の大きさを判断することを学び,一般的には桁数が異なり,長さが長い方が大きくなり,桁数が同じであれば最高位から比較する,すなわち配列の最後のビットである.
(2)AがBより大きい場合-->直接計算し、そうでない場合-->-(B-A).
(3)プリアンブルゼロが発生する可能性があり、除去!
(4)ここでは2つの正の整数を扱うが,負の整数であれば必ずビット|A|+|B|または|A|-|B|を変換できる.
三、高精度「-」のコードテンプレートにコメントを追加
"""
bool cmp(vector &A,vector &B)//  A      B
{
    if(A.size() != B.size()) return A.size() > B.size();
    for(int i=A.size() - 1; i>=0; i--)
        if(A[i]!=B[i])
            return A[i]>B[i];
    return true;
}
"""
}
// C = A - B,   A >= B, A >= 0, B >= 0
vector sub(vector &A, vector &B)
{
    vector C;
    for (int i = 0, t = 0; i < A.size(); i ++ )
    {
        t = A[i] - t;
        if (i < B.size()) t -= B[i];
        C.push_back((t + 10) % 10);//       ,  Ai-Bi-t  ,       Ai-Bi-t,     ,       Ai-Bi-t+10
        if (t < 0) t = 1;
        else t = 0;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();//     
    return C;
}

  :yxc
  :https://www.acwing.com/problem/content/794/
  :AcWing
        。             ,          。