数组项的累计和

Posted

技术标签:

【中文标题】数组项的累计和【英文标题】:Cumulative sum of array items 【发布时间】:2019-05-14 12:39:27 【问题描述】:

我有一个排序后的数组,其值如下:我需要计算总计如下:

场景 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

但是对于任何其他数组值它都会失败

需要帮助!

【问题讨论】:

“失败”是什么意思?有什么例外吗?出乎意料的结果? 没有例外,给定输入工作正常...但是如果我们更改数组值更多的数字,它将失败 @SmartestVEGA 他问什么失败了,你回答它fails...这是什么答案? 100,250,1000,2000 它不会失败。它只是有错误的实现。 【参考方案1】:

选项 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;

编辑

希望这可以帮助您以任何一种方式解决您的问题,如果您对代码有任何疑问或修改,请提出。

【讨论】:

我尝试了 100,250,1000,第一个函数得到 1050,第二个函数得到 300……我期待 1700…… dotnetfiddle.net/0mCPuz 看看我从你的逻辑中更改的代码出了什么问题 sum 函数不可用 @SmartestVEGA 你看到CumulativeSums(numbers).Sum() 不只是CumulativeSums(numbers) 的重要部分了吗,所以请用.Sum() 尝试该函数,因为该方法会返回一个累积和数组 明白了...我添加了 linq,它就像魅力一样工作【参考方案2】:

您也可以在没有任何中间数组分配的情况下获得总和:

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;

【讨论】:

这个case sum和.Sum()不一样 小计 350 小计 1350 总和 2250

以上是关于数组项的累计和的主要内容,如果未能解决你的问题,请参考以下文章

识别和删除数组中重复项的最有效方法是啥?

获取数组第一项的最快方法是啥? [复制]

Python当中的array数组对象

如何获取数组中两个数组项的序列?

json对象的值为数组,怎么获取数组某项的值?(注意不是json数组)

关于forEach方法能否改变数组中每一项的值