简单的数字系列

时间:2012-02-15 10:04:28

标签: numbers series

这是一个简单的数字系列问题,我有像系列一样的数字 2,4,8,16,32,64,128,256这些数字由2,2(square),2(cube)等形成。

现在,如果我添加2+4+8 = 1414只能通过添加2,4和8来获得。 所以我现在手里拿着14,按照一些逻辑我需要得到有助于得到14

的值

示例:

2+4+8 = 14
14(some logic) = 2,4,8.

5 个答案:

答案 0 :(得分: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.这样就可以得到你需要加起来的序列元素的数量。

e.g。用PHP:

$target=14;
$count=log($target+2)/log(2)-1;
echo $count;

给出3,所以你必须添加序列的前3个元素才能得到14。

答案 1 :(得分: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();

答案 2 :(得分:0)

使用一致性模块2权限:14 mod 2 = 014 mod 4 = 214 mod 8 = 614 mod 16 = 1414 mod 32 = 14 ... 此序列的差异是您查找的数字2 - 0 = 26 - 2 = 414 - 6 = 814 - 14 = 0,...

它被称为p-adic表示,并且在形式上有点难以解释,但我希望这能让您对算法有所了解。

答案 3 :(得分:0)

假设C:

unsigned int a = 14;
while( a>>=1)
{
printf("%d ", a+1);
}

答案 4 :(得分:0)

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

int myval = 14;
int maxval = 256;
string elements = "";
for (int i = 1; i <= maxval; i*=2)
{
if ((myval & i) != 0)
elements += "," + i.ToString();
}