[ad_1]
私はビットの行を持っています:
001111000000000
そして、これらをすべて反転させて偽にしたいのですが、これを行うためのコマンドの数は決まっています。これらのコマンドは次のようになります。
3, 5, 7, 11, 13, 17, 19 ... (prime numbers, excluding 2)
各コマンドは、NOT 演算子を使用して対応する量のビットを反転します (0 は 1 になり、1 は 0 になります)。 私の目標は、これを達成するために最小限のコマンドを使用することです。
ビット行の最後の 1 の「後」には、タスクを完了するのに十分なスペースが常にあることに注意してください。
私が試したこと:
最初の 1 から始まる単純な min-max アルゴリズムを使用してみました。いくつかの条件を使用して、使用する最適なコマンドを決定します。 これは単純なシナリオでのみ機能し、次のようなより複雑なシナリオでは機能しません。
001101100100001000000000000000000
解決策 1
2 進数: 00111100000 = 10 進数: 480
480 のすべての約数を見つけます。つまり、480 を割っても余りを残さない数を求めます。 例: 480/10 = 48; したがって、10 は 480 の因数であり、48 も 480 の因数です。
したがって、480 の因数は 1、2、3、4、5、6、8、10、12、15、16、20、24、30、32、40、48、60、80、96、120、160 です。 、240、480。
素因数: 2、3、5 – つまり: 25 ×31 ×51 = 480。
これは、これをコーディングする正しい方向に向けるのに十分なはずです。
[ad_2]
コメント