ряд простых чисел - PullRequest
       9

ряд простых чисел

0 голосов
/ 15 февраля 2012

Это простой вопрос о серии чисел, у меня есть числа в серии, такие как 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.

Ответы [ 5 ]

2 голосов
/ 15 февраля 2012

Это просто:

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.

0 голосов
/ 15 февраля 2012

если это программирование, то что-то вроде этого будет достаточно:

int myval = 14;
int maxval = 256;
string elements = "";
for (int i = 1; i <= maxval; i*=2)
{
if ((myval & i) != 0)
elements += "," + i.ToString();
}
0 голосов
/ 15 февраля 2012

при условии C:

unsigned int a = 14;
while( a>>=1)
{
printf("%d ", a+1);
}
0 голосов
/ 15 февраля 2012

Использовать модуль конгруэнтности 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-adic представление и формально немного сложнее объяснить, но я надеюсь, что это дает вам идею для алгоритма.

0 голосов
/ 15 февраля 2012

Проверьте следующий код 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();
...