C语言中的组合求和

C语言中的组合求和,c,combinations,cartesian-product,large-data,C,Combinations,Cartesian Product,Large Data,假设我们有4个应用程序可以生成100个数据点。现在我们总共有400个数据点。 但是如果我们想知道在下面所有这些情况下,数据点的总和是多少 100*100*100*100. 你会怎么做 每个应用程序的100个数据点是[a][b]类型的数组形式,其中a和b是10,10 因此,对于每个应用程序,给定的数据点都是[app][a][b]。 总结起来似乎很简单:[app][a][b]+[app1][a][b]… 然而,这就是我被困的地方。例如,我不知道如何得到total的组合 如何计算C中数据组合的总和,即

假设我们有4个应用程序可以生成100个数据点。现在我们总共有400个数据点。 但是如果我们想知道在下面所有这些情况下,数据点的总和是多少 100*100*100*100. 你会怎么做

每个应用程序的100个数据点是
[a][b]
类型的数组形式,其中
a
和b是10,10

因此,对于每个应用程序,给定的数据点都是
[app][a][b]
。 总结起来似乎很简单:
[app][a][b]+[app1][a][b]…

然而,这就是我被困的地方。例如,我不知道如何得到total的组合 如何计算
C
中数据组合的总和,即
100*100*100
数据集

我错过了一些数学课。如果你能帮我,那就太好了

编辑:


好的,现在我们有了基本知识,我们可以分析问题:

给定N行M列的T个表,使用每个表中的1个元素,所有可能的和的总和是多少

我们有这样的模式:

17+83+88
17+83+98
....
17+83+37
注意,在这个模式中,来自第一个循环的数字17将在剩余程序的每一个其他组合中出现一次。但到底有多少

第二个程序将出现100个不同的事件,第三个程序的100个事件中的每一个都会出现,以此类推

如果您只是对不同程序中的数据集重新排序,您将得到完全相同的模式,因此我们可以得出结论,所有可能组合的总和=(M*N)^(T-1)*(所有元素的总和)

我们可以将其写成三重for循环:

unsigned int T, N, M; // These are known.

//Assuming the input is of the form
float  data[T][M][N];

long double result = 0.0;

for (int app = 0; app < T; app++) {
    for (int row = 0; row < M; row++) {
        for (int col = 0; col < N; col++ ) {
            result += data[app][row][col];
        }
    }
}

result *= pow(N*M, T-1);
无符号整数T,N,M;//这些都是众所周知的。
//假设输入是表单的
浮动数据[T][M][N];
长双结果=0.0;
对于(int-app=0;app
我不确定我是否正确理解了这一点,如果我错了,请纠正我:

您有
X=4
数量的。。。比如说桌子;然后每个表都有
Y=10
行数,每行都有
Z=10
列数。您需要从每个表中获取一个元素并将它们添加到一起。每次将
X=4
元素添加到一起时,每个表中都有一个元素。您希望对这些总和进行分组,然后将这些总和相加为一个更大的/最终的总和。我说得对吗

如果是这样,这意味着最终你将得到
(Y*Z)^X
,即
(10*10)^4=100000
给定值的单个总和,你在问题中将其视为组合,而它们实际上是每个组合的总和。最后,你想要每个组合的总和,这就是你想要的吗

那么,以下是我的想法,可能会对你有所帮助:

a[tableindex][rowindex][columnindex]
应表示给定单元格中的数字,索引应以零为基础。在生成每个组合的总和时,情况如下所示:

a[0][row0][column0] + a[1][row1][column1] + a[2][row2][column2] + a[3][row3][column3]
表索引将保持不变,行和列索引中的每一个都将从行的
0
Y-1=9
,再到列的
Z-1=9
。现在我想问你,作为一个术语,我们会遇到多少次
a[0][0][0]

  • row0
    column0
    必须是
    0
    ,常数
  • row1
    row2
    row3
    将能够在
    0
    9
    的范围内变化,
    Y=10
    可能的值
  • column1
    column2
    column3
    的范围将从
    0
    9
    Z=10
    可能的值
可能性在数学中成倍增加,
1*1*(10*10*10)*(10*10*10)=1000 000
就是答案。一个通用公式可以写成
(Y*Z)^(X-1)
(Y*Z)
,因为它是一个表中的单元格数量,提高到
(X-1)
的幂次,因为除了我们固定的表之外,还有很多表

因为每个表都有相同数量的单元格,而且这个例子对每个术语都适用;您只需将每个单元格相加,然后将结果乘以
(Y*Z)^(X-1)
,对于您的情况,这是一百万。如果您的数字足够小,不会导致溢出,则以下代码可以做到这一点:

#define tablecount 4
#define rowcount 10
#define columncount 10

int main(int argc, char const *argv[])
{
    int a[tablecount][rowcount][columncount] = { 0 };

    // Assuming it gets filled somewhere in between

    int thenumber = 0;
    for (int table = 0; table < tablecount; table++)
        for (int row = 0; row < rowcount; row++)
            for (int column = 0; column < columncount; column++)
                thenumber += a[table][row][column];

    for (int i = 1; i < tablecount; i++)    // notice that the initial value for i is 1
        thenumber *= rowcount * columncount;

    return 0;
}
#定义tablecount 4
#定义行数10
#定义列计数10
int main(int argc,char const*argv[]
{
int a[tablecount][rowcount][columncount]={0};
//假设它在两者之间的某个地方被填满
整数=0;
for(int table=0;table

确保在数组之间填充,并在需要时包含适当的库。

如果我不清楚,请告诉我。我会做一个较小的例子。你首先要考虑的是应用程序如何输出他们的“数据点”。然后,您必须考虑如何将数据导入求和程序。一旦加载到求和程序中,剩下的应该很简单。它是否只会是4个应用程序?或者可以有更多?它们是浮点数,Joachim Bytefire,可以有四个以上的应用程序。@JoachimPileborg:我知道如何做求和部分。这相当简单。我无法获得电源数据的组合,即100*100*100*100。。那么韩寒可以使用什么样的数据结构呢
#define tablecount 4
#define rowcount 10
#define columncount 10

int main(int argc, char const *argv[])
{
    int a[tablecount][rowcount][columncount] = { 0 };

    // Assuming it gets filled somewhere in between

    int thenumber = 0;
    for (int table = 0; table < tablecount; table++)
        for (int row = 0; row < rowcount; row++)
            for (int column = 0; column < columncount; column++)
                thenumber += a[table][row][column];

    for (int i = 1; i < tablecount; i++)    // notice that the initial value for i is 1
        thenumber *= rowcount * columncount;

    return 0;
}