2016-05-15 9 views
4

Я хочу вычислить сумму функции, определенной над [L, R].Сумма специальной функции в диапазоне

Функция сначала вычисляет xor каждой подстроки числа, а затем добавляет различные значения, вычисленные и возвращающие.

Eg: F(312) 
    3 = 3 
    3^1 = 2 
    3^1^2 = 0 
    1 = 1 
    1^2 = 3 
    2 = 2 
    Sum of distinct values = 3+2+1 = 6 = F(312) 

Как я могу рассчитать это быстро? L, R может находиться в диапазоне от 1 до 1000000000.

Например: если я даю L = 5 и R = 15, тогда функция должна вычислять F (5) + F (6) + F (7) ... + F (15)

+0

Есть ли язык программирования вы собираетесь использовать? Также уточните: 3^1 в большинстве языков означает 3, питание от 1, то есть 3. Почему 3^1 = 2 и 1^2 = 3? –

+0

@ Quasimodo'sclone из контекста вопроса будет оператором XOR. – bashrc

+0

Ах, ладно, я получил это, перечитывая вопрос тщательно. И есть ли предпочтительный язык? –

ответ

0

Одно из возможных решений в JavaScript может выглядеть так: функция

<script type="text/javascript"> 

function sumXorSubStr(numStr) 
{ 
    numStr = parseInt(numStr).toString(); 

    var 
    results = {}, 
    lastPos = numStr.length -1 
    ; 

    for(var start=0 ; start <= lastPos ; start++) 
    for(var op = 0, i = start ; i <= lastPos ; i++) 
     results[ op ^= numStr[i] ] = 1; 

    var sum = 0; 
    for(var i in results) 
    sum += parseInt(i); 
    return sum; 
} 

alert(sumXorSubStr(312)); 

</script> 

обертку в цикле из/является оптимальным способом. Побольше производительности можно достичь, объединив его в одну функцию.

function sumRangeXorSubStr(from, to) 
{ 
    var result = 0; 

    for(var n=from; n<=to; n++) 
    result += sumXorSubStr(n); 

    return result; 
} 

Я некоторое представление о более производительном способе, не уверен, если я достану ...

+0

Спасибо за это, однако я хотел рассчитать сумму этой функции F в диапазоне [L, R]. как я вижу, этот код просто вычисляет ответ для одного номера, я обновил детали вопроса, чтобы сделать его понятным. –

+0

Вы хотите дополнительный nCr («от n выбора r») или, как сказано в немецком алгоритме «n over k» для вычисления параметр функции? Ах нет, это было бы 5 * 6 * ... * 15 –

+0

Просто оберните код, который вычисляет результат для одного числа в цикле, который начинается с L и заканчивается на R –