Как суммировать последовательность номеров этажей? - PullRequest
0 голосов
/ 02 февраля 2012

Как мне сложить следующую последовательность:

⌊n∕2⌋ + ⌊n+1∕2⌋ + ⌊n+2∕2⌋ + ...... + (n-1)

То, что я думаю, это отбросить пол и подвести итог, что внутри каждого этажа !! Это всего лишь предположение.

Дайте мне любую подсказку или общую формулу, которая поможет мне суммировать их

Спасибо

Ответы [ 4 ]

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

Поскольку вы спрашиваете на сайте вопросов и ответов о программировании, я должен предположить, что вам нужен вычислительный ответ.Вот так ...

int sum = 0;
for (int j=0; j<n-1; ++j) {
    sum += (n+j)/2;
}

int автоматически усечется до пола.

Менее умный ответ задницы таков.Пусть n = 2k.Тогда сумма становится

k + k + k+1 + k+1 + ... + 2k-1 + 2k-1 = 2(k + k+1 + ... + 2k-1)

, и вы можете использовать формулу

1 + 2 + ... + a = a(a+1)/2

с небольшим количеством алгебры, чтобы завершить ее.

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

Пока вы не требуете умного алгоритма или оптимизаций, самый простой подход, который я могу придумать, - это старый добрый верный цикл. В C # один из способов сделать это будет выглядеть примерно так:

namespace Practice
{
    using System;

    public class SequenceAggregator
    {
        public double FirstElement
        {
            get;
            set;
        }

        public int Length
        {
            get;
            set;
        }

        public double Calculate()
        {
            double sum = 0;

            for (var i = FirstElement; i < FirstElement + Length; i++)
            {
                sum += Math.Floor(i / 2);
                Console.WriteLine("i={0}, floor(i/2)={1}, sum={1}", 
                                  i, Math.Floor(i/2), sum);
            }

            return sum;
        }
    }
}

И вы можете использовать этот класс следующим образом:

namespace Practice
{
    using System;

    class Program
    {
        static void Main(string[] args)
        {
            SequenceAggregator a = new SequenceAggregator();
            a.FirstElement = 1;
            a.Length = 3;
            Console.WriteLine("Sum:{0}", a.Calculate());
        }
    }
}
0 голосов
/ 02 февраля 2012

для произвольного диапазона 1..20 вы можете сделать:

sum = (1..20).inject{|sum, n| sum + (n/2.0).floor}

и, конечно, вы можете использовать любой диапазон. Этот пример написан на Ruby, но вы можете сделать что-то похожее на многих языках - алгоритм тот же.

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

Если n чётно, то floor(n/2) == floor((n+1)/2)floor((n+2)/2) == floor(n/2) + 1.

Другая часть головоломки представляет собой выражение для суммы арифметической последовательности, которую можно найти здесь .

...