Накопленная сумма элементов массива - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть отсортированный массив со значениями, как показано ниже: мне нужно вычислить итоговое значение, как показано ниже:

Сценарий 1 - Значения массива 12,15,17

12+15 = 27 
27+17 = 44 
44+27 = 71
Total = 71

Сценарий 2 Значения массива 12,15,17,19

12+15 = 27
27+17 = 44
44+19 = 63
27+44+63 = 134

Всего = 134

Сценарий 3 Значения массива 12,15,17,19,23

12+15 = 27
27+17 = 44
44+19 = 63
63+23 = 86
27+44+63+86 = 220

Итого = 220

Сценарий от 4 до N Значения массива 12,15,17,19,23 ..... N

Я должен привести приведенную выше логику к коду C #

Я написал так:

  int[] myNumbers = new int[] { 100,250,1000};

            Array.Sort(myNumbers);
            int sum = 0;
            int temp = 0;

            foreach (int y in myNumbers)
            {
                sum = sum + y;              
            }

            for(int i=0;i<myNumbers.Length-1;i++)
            {
               temp = temp + myNumbers[i];      
            }

           sum = sum + temp;

           Console.Write(sum);  

Приведенный выше код отлично работает для значений массива 100,250,1000

Но он не работает для любых других значений массива

Нужна помощь!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы также можете получить сумму без выделения промежуточного массива:

static int Cumulate( int[] numbers )
{
    if ( numbers == null || numbers.Length < 2 )
        return 0;

    Array.Sort( numbers );

    var prevsum = numbers[0] + numbers[1];
    var sum = prevsum;

    for ( int i = 2 ; i < numbers.Length ; i++ )
    {
        prevsum += numbers[i];
        sum += prevsum;
    }

    return sum;
}
0 голосов
/ 13 декабря 2018

Вариант 1

Поэтому, если вы хотите получить точные результаты, как в ваших примерах, вы можете использовать этот метод.Он вернет вам массив частичных сумм, который вы позже сможете подвести для получения результата:

private static long[] CumulativeSums(long[] values)
{
    if (values == null || values.Length <= 1) return new long[0];

    var results = new long[values.Length];
    results[0] = values[0] + values[1];

    for (var i = 1; i < values.Length - 1; i++)
    {
        results[i] = results[i - 1] + values[i + 1];
    }

    return results;
}

И используйте его так:

var numbers = new long[] { 12, 15, 17, 19 };
var sumOfCumulativeSums = CumulativeSums(numbers).Sum();

И sumOfCumulativeSumsбудет 134.

Вариант 2

Но фактическое правильное представление совокупной суммы: a, a+b, a+b+c, ....Поэтому, если вам нужно правильное представление метода, который возвращает вам правильные кумулятивные суммы, вы можете использовать этот метод вместо:

public static long[] CumulativeSums(long[] values)
{
    if (values == null || values.Length == 0) return new long[0];

    var results = new long[values.Length];
    results[0] = values[0];

    for (var i = 1; i < values.Length; i++)
    {
        results[i] = results[i - 1] + values[i];
    }

    return results;
}

Редактировать

Надеюсь, это поможет вамрешить вашу проблему любым из способов, и если у вас есть какие-либо вопросы или изменения по поводу кода, пожалуйста, спросите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...