让我们说我们有4个应用程序可以产生100个数据点。所以,现在我们总共有400个数据点。 但是,如果我们想要找出以下所有情况下数据点的总和 100 * 100 * 100 * 100。你会怎么做?
每个应用程序的100个数据点采用[a][b]
类型的数组形式,其中a
和b为10,10。
因此,对于每个应用程序,对于给定的数据点,它是[app][a][b]
。
总结似乎很简单:[app][a][b]+[app1][a][b]...
但是,这就是我被困住的地方。我不知道如何获得总数的组合
如何计算C
中数据组合的总和......即100*100*100*100
数据集。
我在这里错过了一些数学。如果你能在这里帮助我,那就太好了。
编辑:
app0 [[17, 24, 85, 43, 4], [92, 6, 17, 62, 20], [72, 100, 59, 84, 67]]
app1 [[83, 8, 95, 74, 61], [95, 84, 15, 70, 89], [6, 91, 13, 85, 43]]
app2 [[88, 98, 86, 52, 32], [37, 1, 96, 43, 72], [10, 62, 76, 100, 35]]
possible data sets are
17+83+88
17+83+98
....
17+83+37
...
答案 0 :(得分:1)
我不确定我是否正确使用了这个,所以如果我错了就纠正我:
你有X = 4
数量的...... 表,让我们说;然后每个表都有Y = 10
个行,每行有Z = 10
个列。您将从每个表中获取一个元素并将它们一起添加。每次将X = 4
个元素添加到一起时,每个表中都会有一个元素。您希望将这些总和分组,然后将这些总和一起添加到更大/最终总和中。我是对的吗?
如果是这样,这意味着最终您将得到(Y * Z) ^ X
,即(10 * 10) ^ 4 = 100 000 000
给定值的个别总和,您将其视为组合在你的问题中,当他们实际上是每个组合的总和时。最后,你想要每个组合的总和,这就是你所追求的吗?
那么,这就是我在想的可以帮助你的东西:
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) = 1 000 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;
}
确保在中间填充数组,并在需要时包含适当的库。
答案 1 :(得分:0)
好的,现在我们已经掌握了基础知识,我们可以分析问题:
给定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);