如何将数组的每个元素与同一数组的其他元素相加?

Posted

技术标签:

【中文标题】如何将数组的每个元素与同一数组的其他元素相加?【英文标题】:How to add each element of an array with other elements of the same array? 【发布时间】:2013-05-28 23:34:29 【问题描述】:

假设我有一个数组

a[3]=1,3,8  

我希望输出是一个数组,其中包含通过将数组 a 中的数字相加获得的数字以及数组 a 的元素。即,

b[0]=1
b[1]=3
b[2]=8
b[3]=4  //(1+3)
b[4]=9  //(1+8)
b[5]=11 //(3+8)
b[6]=12 //(1+3+8) 

我该怎么做?

【问题讨论】:

所以你想生成一组数字的所有可能子集并列出它们的总和,对吧? 类似于 Fibonaccy 但这多了一层? 为了清楚起见,您想计算数组中每个可能的元素组合的总和吗? @OliCharlesworth 这就是她的例子表明我不确定:) 看起来像是在寻找子集和每个子集的总和 【参考方案1】:

因此,您希望生成一组数字的所有可能子集并列出它们的总和。

首先,您要枚举所有子集。由于在包含N 元素的集合中有2 ^ N 子集,您可以简单地通过从0 到1 << (sizeof(arr) / sizeof(arr[0])) 迭代自然数并按以下方式处理数字的二进制表示来完成此操作:如果特定位设置在位置k,则kth 元素在当前生成的子集中,否则不在。

然后,您应该将所有选定的元素加在一起,并将结果存储在另一个数组的下一个槽中(显然是2 ^ N)。

#define COUNT(a) (sizeof(a) / sizeof(a[0]))
#include <limits.h> // for CHAR_BIT

unsigned a[3] =  1, 3, 8 ;
unsigned sums[1 << COUNT(a)] =  0 ;

for (unsigned i = 0; i < COUNT(sums); i++) 
    for (unsigned j = 0; j < sizeof(i) * CHAR_BIT; j++) 
        if ((i >> j) & 1) 
            sums[i] += a[j];
        
    


for (unsigned i = 0; i < COUNT(sums); i++) 
    printf("%d\n", sums[i]);

【讨论】:

【参考方案2】:

我会这样做:

b[0] = 0;  //This is not listed in the question, but should be included in the result IMHO.
for(long i = 0; i < elementsA; i++) 
    long preexistingElements = 1 << i;
    long curElement = a[i];
    for(long j = 0; j < preexistingElements; j++) 
        b[j + preexistingElements] = b[j] + curElement;
    

该算法在结果数组的大小上是线性的,因为它的每个元素都是以恒定成本计算的。

如果你真的必须排除零并且想要malloc结果数组,把算法反过来,让b从后面填充零元素作为最后一个元素。

【讨论】:

以上是关于如何将数组的每个元素与同一数组的其他元素相加?的主要内容,如果未能解决你的问题,请参考以下文章

将一个数字与 Python 中列表(或数组)中的每个元素相加

SwiftMapFlatMapCompactMapCompactMapValuesFilterReduce

对象数组如何存储在内存中?

求问php两个二维数组中每个元素的相加

lingo中两个数组对应元素相加如何表示

如何将两个数组与每个元素相乘作为数字c ++