これは単純な数列の質問です
。2,4,8,16,32,64,128,256
これらの数が形成されるような数列の数が2,2(square),2(cube)
あります。
今私が追加すると2+4+8 = 14
。14
加算 2,4 および 8 によってのみ取得されます。だから私は14
今私の手に持っています。14
例:
2+4+8 = 14
14(some logic) = 2,4,8.
これは簡単です:
2+4+8=14 ... 14+2=16
2+4+8+16=30 ... 30+2=32
2+4+8+16+32=62 ... 62+2=64
したがって、合計に 2 を追加し、ld (バイナリ対数) を計算してから 1 を引くだけで済みます。これにより、合計する必要があるシーケンスの要素数が得られます。
たとえば、PHP の場合:
$target=14;
$count=log($target+2)/log(2)-1;
echo $count;
3 を与えるので、シーケンスの最初の 3 つの要素を追加して 14 を取得する必要があります。
次の C# コードを確認してください。
x = 14; // In your case
indices = new List<int>();
for (var i = 31; i >= i; i--)
{
var pow = Math.Pow(2, i);
if x - pow >= 0)
{
indices.Add(pow);
x -= pow;
}
}
indices.Reverse();
合同モジュールの 2 乗を使用: 14 mod 2 = 0
, 14 mod 4 = 2
, 14 mod 8 = 6
, 14 mod 16 = 14
, 14 mod 32 = 14
... この数列の違いは、求める数字2 - 0 = 2
, 6 - 2 = 4
, 14 - 6 = 8
, 14 - 14 = 0
, ...
これは p 進表現と呼ばれ、形式的に説明するのは少し難しくなりますが、アルゴリズムのアイデアが得られることを願っています。