0

我想通过向后递增来遍历数组中值的所有组合。
所以让我们有一个数组

    int array[10] = {0,0,0,0,0,0,0,0,0,0};

我想这样增加它:{0,0,0,0,0,0,0,0,0,1} > {0,0,0,0,0,0,0,0,0,2 }...{p-1,p-1,p-1,p-1,p-1,p-1,p-1,p-1,p-1,p-1}。

例如较小的数组,p=3:{0,0,0}>{0,0,1}>{0,0,2}>{0,1,0}>{0,1,1}>{ 0,1,2}...{2,2,2}

数组可以sizeof(int)*m很大,其中 1<=m<=10。

有人可以帮我解决这个问题吗?

编辑:抱歉,忘记了这个。
好吧,很抱歉混淆了,但我还有一个条件。

该数组不会采用那种形式。这将是这样的例子

    int array[10] = {0,0,0,0,0,0,0,0,0,0};
    int help[10] = {3,4,0,1,0,0,3,0,1,0};

我想得到数组[帮助[]!= 0]中的值组合,在这种情况下数组[0],数组[1],数组[3],数组[6],数组[8]所以->

    int array[10] = {0,0,0,0,0,0,0,0,0,0};
    int array[10] = {0,0,0,0,0,0,0,0,1,0};
    int array[10] = {0,0,0,0,0,0,0,0,2,0};
    int array[10] = {0,0,0,0,0,0,1,0,0,0};
    int array[10] = {0,0,0,0,0,0,1,0,1,0};
    int array[10] = {2,2,0,2,0,0,2,0,2,0};     

p=3
类似 for() 循环的内容将变为 i=0,1,3,6,8,其中值为 i=help[i]!=0。

4

3 回答 3

2

这是一个例子:

void increment(int array[], size_t size, int limit)
{
     do
     {
         if (++array[--size] != limit)
         {
             break;
         }
         array[size] = 0; // value overflow
     }
     while (size);
}

用法:

int array[10];
memset(array, 0, sizeof(array));

increment(array, 10, 3);

编辑:带过滤器的算法

void increment(int array[], int filter[], size_t size, int limit)
{
     do
     {
         if (!filter[--size])
         {
             // skip this position
             continue;
         }
         if (++array[size] != limit)
         {
             break;
         }
         array[size] = 0; // value overflow
     }
     while (size);
}
于 2013-03-22T14:03:22.757 回答
1

我看到问题发生了一些变化,从向后递增数组到在基数(n)上加一……这是一个不同的问题。

int base = 3;

for( int i = (sizeof( array ) / sizeof( array[0] ))-1; i >= 0; )
{
    if( ++array[i] < base )
        break;
    else
        array[i--] = 0;
}
于 2013-03-22T13:59:14.753 回答
0

这相当于简单地从自然数递增,从 0 到 (p+1) ^ arrayLength,以 p+1 为基数。

所以对于你的例子,

for (long i=0; i<4^10; i++)
{
   convert i to string in base (p+1), left- padding with 0s
   convert characters in string to comma separated array format and print 
}
于 2013-03-22T14:02:21.323 回答