向数组中添加元素

5
我有一个由十个整数组成的数组。我想按组对元素求和,例如,我想将元素0的值与元素1的值相加,然后与元素2的值相加,然后是3,一直到9,然后将元素1的值与2、3、直到9的值相加,直到每组两个值都被相加并存储在一个变量中。然后,我希望重复这个过程,将3个元素分为一组,4个元素分为一组,5个元素分为一组,一直到10个元素分为一组。每个结果总数都存储在单独的变量中。到目前为止,我唯一想到的方法如下:
int i = 0;
int p = 1;
int q = 2;
int r = 3;

while (i < NumArray.Length - 3)
{
    while (p < NumArray.Length - 2)
    {
        while (q < NumArray.Length-1)
        {
            while (r < NumArray.Length)
            {
                foursRet += NumArray[i] + NumArray[p] + NumArray[q]+ NumArray[r];
                r++; 
            }
            q++;
            r = q + 1;
        }
        p++;
        q = p + 1;
        r = q + 1;
    }
    i++;
    p = i + 1;
    q = i + 2;
    r = i + 3;
}

上面是对四个组进行求和的示例。 我想知道是否有人可以友好地向我展示一种更简洁、更优雅的实现方式。非常感谢。

1
感觉像作业?如果是,请标注为作业。如果不是,请说明一下? - Hans Kesting
我有点困惑于需求。你能否更新问题,提供一个示例输入和所需的输出。 - Jamiec
你能解释一下这些计算的目的吗?也许有更好的方法来解决问题... - Christoph Fink
如果您能提供函数前后数组内容的示例,将有助于理解。如果您想要做一些直到没有更多数组为止的操作,您可能需要了解递归(这里是基础知识的链接)。 - Gabriel GM
这有点像PASCAL哈哈哈哈哈 @Hans Kesting 这是一份100%的家庭作业。 - NoWar
显示剩余2条评论
2个回答

4

因为使用LINQ*让所有事情变得更好:

using System; // Output is below
using System.Linq;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var inputArray = Enumerable.Range(0, 10).ToArray();

            var grouped =
                from Buckets in Enumerable.Range(1, inputArray.Length)
                from IndexInBucket in Enumerable.Range(0, inputArray.Length / Buckets)
                let StartPosInOriginalArray = IndexInBucket * Buckets
                select new
                {
                    BucketSize = Buckets,
                    BucketIndex = StartPosInOriginalArray,
                    Sum = inputArray.Skip(StartPosInOriginalArray).Take(Buckets).Sum()
                };

            foreach (var group in grouped)
            {
                Debug.Print(group.ToString());
            }

            Console.ReadKey();
        }
    }
} // SCROLL FOR OUTPUT

{ BucketSize = 1, BucketIndex = 0, Sum = 1 }
{ BucketSize = 1, BucketIndex = 1, Sum = 2 }
{ BucketSize = 1, BucketIndex = 2, Sum = 3 }
{ BucketSize = 1, BucketIndex = 3, Sum = 4 }
{ BucketSize = 1, BucketIndex = 4, Sum = 5 }
{ BucketSize = 1, BucketIndex = 5, Sum = 6 }
{ BucketSize = 1, BucketIndex = 6, Sum = 7 }
{ BucketSize = 1, BucketIndex = 7, Sum = 8 }
{ BucketSize = 1, BucketIndex = 8, Sum = 9 }
{ BucketSize = 1, BucketIndex = 9, Sum = 10 }
{ BucketSize = 2, BucketIndex = 0, Sum = 3 }
{ BucketSize = 2, BucketIndex = 2, Sum = 7 }
{ BucketSize = 2, BucketIndex = 4, Sum = 11 }
{ BucketSize = 2, BucketIndex = 6, Sum = 15 }
{ BucketSize = 2, BucketIndex = 8, Sum = 19 }
{ BucketSize = 3, BucketIndex = 0, Sum = 6 }
{ BucketSize = 3, BucketIndex = 3, Sum = 15 }
{ BucketSize = 3, BucketIndex = 6, Sum = 24 }
{ BucketSize = 4, BucketIndex = 0, Sum = 10 }
{ BucketSize = 4, BucketIndex = 4, Sum = 26 }
{ BucketSize = 5, BucketIndex = 0, Sum = 15 }
{ BucketSize = 5, BucketIndex = 5, Sum = 40 }
{ BucketSize = 6, BucketIndex = 0, Sum = 21 }
{ BucketSize = 7, BucketIndex = 0, Sum = 28 }
{ BucketSize = 8, BucketIndex = 0, Sum = 36 }
{ BucketSize = 9, BucketIndex = 0, Sum = 45 }
{ BucketSize = 10, BucketIndex = 0, Sum = 55 }

*并不是所有事情都适合使用LINQ


1
你甚至可以做得更好:Enumerable.Range(0, 10).ToArray() :) - user57508
好发现,真不敢相信我没做到那个! - George Duckett

1

如果我理解正确,您有一个长度为n的数字数组。您想从中选择所有m个数字的组合。然后,您想求出所有这些组合的和,并最终计算这些总和的总和。

例如,给定n = 6个数字,您可以以15种不同的方式选择m = 4个元素(数字是数字数组中的索引):

0 1 2 3
0 1 2 4
0 1 3 4
0 2 3 4
1 2 3 4
0 1 2 5
0 1 3 5
0 2 3 5
1 2 3 5
0 1 4 5
0 2 4 5
1 2 4 5
0 3 4 5
1 3 4 5
2 3 4 5

如果n < 32(您的数组中不超过31个数字),则可以使用32位算术有效地生成索引。以下函数基于Gosper's hack

IEnumerable<UInt32> GetIndexBits(Int32 m, Int32 n) {
  unchecked {
    var i = (UInt32) (1 << m) - 1;
    var max = (UInt32) (1 << n);;
    while (i < max) {
      yield return i;
      var u = (UInt32) (i & -i);
      var v = u + i;
      i = v + (((v ^ i)/u) >> 2);
    }
  }
}

使用m = 4n = 6,此功能将生成这些数字(以二进制形式显示):

001111
010111
011011
011101
011110
100111
101011
101101
101110
110011
110101
110110
111001
111010
111100

您随后可以使用LINQ创建总和:

var m = 4;
var numbers = new[] { 1, 2, 3, 4, 5, 6 };
var sum = GetIndexBits(4, numbers.Length)
  .Select(
    bits => Enumerable
      .Range(0, numbers.Length)
      .Where(i => ((1 << i) & bits) != 0)
  )
  .Select(indices => indices.Sum(i => numbers[i]))
  .Sum();

根据提供的输入,总和将为210,这与问题中NumArray包含数字1到6时foursRet的结果相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接