0

这是一个简单的数字系列问题,我有一系列数字,比如 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.
4

5 回答 5

2

这是个简单的:

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。

于 2012-02-15T10:09:34.523 回答
0

检查以下 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();
于 2012-02-15T10:09:32.630 回答
0

使用全等模块 2-powers: 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-adic 表示,形式上有点难以解释,但我希望这能让您对算法有所了解。

于 2012-02-15T10:11:58.223 回答
0

假设 C:

unsigned int a = 14;
while( a>>=1)
{
printf("%d ", a+1);
}
于 2012-02-15T10:16:49.280 回答
0

如果这是编程,这样的事情就足够了:

int myval = 14;
int maxval = 256;
string elements = "";
for (int i = 1; i <= maxval; i*=2)
{
if ((myval & i) != 0)
elements += "," + i.ToString();
}
于 2012-02-15T10:17:19.480 回答