blog

大きな整数の加算、減算、乗算、除算

大きな数の格納\n配列の添え字は、大きな数の下位桁から上位桁までを格納するために使用されます。\n\n大きな整数の加算\n\n加算処理\nA[i] + B[i] + t は各位の和。\nsum % 1...

Mar 26, 2020 · 3 min. read
シェア

大きな数の保存

配列の添え字には、大きな数の下位から上位までの桁が格納されます。

大きな整数の加算

説明:AとBの最大桁数は0010000です。

加算

A[i]+B[i]+tは各ポジションでの合計値

sum % 10は結果の各ビットの桁数、sum / 10は次のビットの四捨五入。

アルゴリズムの実装

// A > B A >= 0 B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
 if (A.size() < B.size()) return add(B, A);
 vector<int> C;
 int t = 0;
 for (int i = 0; i < A.size(); i ++ )
 {
 //このラウンドの計算
 t += A[i];
 if (i < B.size()) t += B[i];
 
 //次のラウンドの更新
 C.push_back(t % 10);
 t /= 10;
 }
 
 //特殊な場合の処理
 if (t) C.push_back(t);
 return C;
}

若干の変形あり

//A >= 0 B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
 vector<int> C;
 int t = 0;
 for (int i = 0; i < A.size() || i < B.size(); i ++ )
 {
 if (i < A.size()) t += A[i];
 if (i < B.size()) t += B[i];
 
 C.push_back(t % 10);
 t /= 10;
 }
 if (t) C.push_back(t);
 return C;
}

大きな整数の引き算

説明:AとBの最大桁数は0010000です。

減算

A[i]-B[i]-tは各ビットの引き算

結果のビットの値は % 10

A[i]-B[i]-tが負なら、借方ビットは1。

A[i]-B[i]-tが非負の場合、デビットビットは0。

アルゴリズムの実装

// A >= B A >= 0 B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
 vector<int> 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);
 if (t < 0) t = 1;
 else t = 0;
 }
 
 //先頭のゼロを取り除く
 while (C.size() > 1 && C.back() == 0) C.pop_back();
 
 return C;
}

>= B

bool cmp(vector<int> A, vector<int> 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;
}

大きな整数の乗算

説明: A * bの結果を求めます。Aの最大ビット数は1000000で、bはシェーピングデータの通常の範囲です。

乗算

A[i]*b+tは各ビットの計算の合計。

10 は結果に対応するビットの値です。

/10は次の桁。

アルゴリズムの実装

///A >= 0 b >= 0
vector<int> mul(vector<int> &A, int b)
{
 vector<int> C;
 int t = 0;
 for (int i = 0; i < A.size() || t; i ++ )
 {
 if (i < A.size()) t += A[i] * b;
 
 C.push_back(t % 10);
 t /= 10;
 }
 while (C.size() > 1 && C.back() == 0) C.pop_back();
 return C;
}

大きな整数の除算

説明: A / bの商と余りを求め、Aは最大1000000ビット、bは通常のシェーピングデータ範囲です。

除算の手順

r * 10 + A[i]は各ビットの計算結果

/ bは結果の対応するビットの値。

b は余り

アルゴリズムの実装

vector<int> div(vector<int> &A, int b, int &r)
{
 vector<int> C;
 r = 0;
 for (int i = A.size() - 1; i >= 0; i -- )
 {
 r = r * 10 + A[i];
 
 C.push_back(r / b);
 r %= b;
 }
 reverse(C.begin(), C.end()); //ヘッダーファイルは<algorithm>
 while (C.size() > 1 && C.back() == 0) C.pop_back();
 
 return C;
}
Read next

クロスドメインについて語る2000語

クロスドメイン・リソース・ソリューションがどのようなものであっても、本質的にはサーバサイドのサポートが必要です。クロスドメインリソース取得を機能させるのは、あなたがリソースを取得する権限を持っているというサーバーの暗黙の認識です。以下に説明する方法はすべて、実際にはクライアントサイドとサーバーサイドの相互作用です。 ブラウザの "同一オリジンポリシー "は、AJAX技術によるリソースへのクロスドメインアクセスを防ぐだけで、このようなリソースへのクロスドメインアクセスを禁止するものではありません。

Mar 26, 2020 · 4 min read