私は現在、モジュラスと剰余を 10 で除算して連続的に計算する、多分 (または明らかに) やや素朴な方法を使用しています。
そうすれば、O(n^2)
複雑さが増し、15 分よりもはるかにうまくいくはずです。
ただし、 による除算を正確に行う方法は一見の価値があります10
。
- long による long の一般的な除算ではなく、標準の long 数による除算のより単純なアルゴリズムを適用するようにしてください。
- メモリを再利用するようにしてください。10Kb ブロックを 10000 回割り当てると、確実にパフォーマンスが低下します。
edit
long 2 進数を 1 回のパスで 10 で除算し、結果とリマインダーの両方を取得する方法。追加メモリなし。
簡単な疑似コード (a[0]
は最上位桁)
int r = 0;
for (int i = 0; i < n; ++i) {
r = r * 2 + a[i];
a[i] = r / 10;
r = r % 10;
}
number の例を見てみましょう100111011 = 315
。
ステップ 0:r = 1, a[0] = 0
ステップ 1:r = 2, a[1] = 0
ステップ 2:r = 4, a[2] = 0
ステップ 3:r = 9, a[3] = 0
ステップ 4:r = 9, a[4] = 1
ステップ 5:r = 9, a[5] = 1
ステップ 6:r = 8, a[6] = 1
ステップ 7:r = 7, a[7] = 1
ステップ 8:r = 5, a[8] = 1
したがって、リマインダーは5
で、結果は000011111 = 31
です。