そのため、GNU やその他のライブラリが大規模な乗算にどのように必要であるかについていくつかのトピックを読んできましたが、大きな外部ライブラリを使用できないものに取り組んでいます。したがって、私は大きな数字を文字列として入力するアプローチを採用し、これらの数字でやりたいことを実行できましたが、今は難しい部分に来ました。それぞれ最大 50 桁までの 2 つの整数の乗算です。私のコードに実装でき、これを可能にする約200行以下のコードを見つけることができるコードはありますか? または、これらの数値を分割してこの乗算を実装する簡単な方法はありますか? いくつかの考えや助けをいただければ幸いです。
質問する
379 次
2 に答える
1
過去にこれを行った方法は、任意のサイズの数値の整数の配列を作成することです。50 桁の 10 進数には、約 167 ビット、つまり 20 バイト強が必要です。32 ビット整数の配列にうまく収まるように、24 に切り上げます。次に、10 進文字列を 24 ビット整数 a と b に変換します。そこからは、手で行うように教えられたのと同じ方法で効果的に乗算を行うことができます。これらの数値を加算する関数が既にあると仮定すると、次のように乗算できます。
int32_t a[6];
int32_t b[6];
// multiplication results require twice as much space as the operands
int32_t result[12];
memset(&result, 0, sizeof(12));
int32_t temp_result[6][7];
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
int64_t product = a[i] * b[j];
temp_result[i][j] = product & (0xffffffff);
temp_result[i][j + 1] = product & (0xffffffff00000000);
}
}
for (int i = 0; i < 6; i++)
{
// source a, source b, result
add(temp_result[i], result[i], result[i]);
}
add 関数をまだ持っていない場合、プロセスは非常に似ています。
于 2013-06-07T19:21:13.163 に答える
0
mini-gmp (小さな単一の .c および .h ファイル、完全な gmp パッケージの一部)。
multiprecision を起動します (それほど小さくはありませんが、ヘッダーのみ)。
于 2013-06-08T04:43:15.103 に答える