虽然不完全清楚在获得最大离散数列方面可能存在哪些限制,但如果您能够通过传递一个简单的数组来保存离散数,并在函数中保持运行总和,可以简化该过程。例如,将数组a
与当前的j
一起传递到函数中,并返回组成数组中总和的元素数量,可以使用以下代码完成:
int largest_discrete_sum (int *a, int j)
{
int n, sum = 0;
for (n = 1;; n++) {
a[n-1] = n, sum += n;
if (n * (n + 1) / 2 > j)
break;
}
a[sum - j - 1] = 0;
return n;
}
将它放在一个简短的测试程序中会像这样:
#include <stdio.h>
int largest_discrete_sum(int *a, int j);
int main (void) {
int i, idx = 0, v = 50;
int a[v];
idx = largest_discrete_sum (a, v);
printf ("\n largest_discrete_sum '%d'\n\n", v);
for (i = 0; i < idx; i++)
if (a[i])
printf (!i ? " %2d" : " +%2d", a[i]);
printf (" = %d\n\n", v);
return 0;
}
int largest_discrete_sum (int *a, int j)
{
int n, sum = 0;
for (n = 1;; n++) {
a[n-1] = n, sum += n;
if (n * (n + 1) / 2 > j)
break;
}
a[sum - j - 1] = 0;
return n;
}
使用示例/输出
$ ./bin/largest_discrete_sum
largest_discrete_sum '50'
1 + 2 + 3 + 4 + 6 + 7 + 8 + 9 +10 = 50
如果我在离散值选择方面错过了某个限制条件,我深表歉意,但是以这种方式进行处理,您可以确保获得与您的总和相等的最大离散值数量。如果您有任何问题,请告诉我。