【问题标题】:Incrementing values in array backwards向后递增数组中的值
【发布时间】:2013-03-22 13:55:57
【问题描述】:

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

    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

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

编辑:对不起,忘了这个..
好的,很抱歉造成混淆,但我还有一个条件..

那个数组不会是那种形式。这将是这样的 example

    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};

我想获得数组[help[]!=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 为底的数字?
  • 基本上表示以 base(p) + 1 为单位的数字。在寻求帮助之前,您需要展示您的算法尝试。
  • 是的,它应该在 base(p) 中但在那里犯了一个错误:) 会纠正它
  • 如果您知道如何将 1 加到多位数字上,那么您已经知道如何操作了。
  • 顺便把每个值都设置为0,你可以使用= {0};来设置。

标签: c algorithm math


【解决方案1】:

这是一个例子:

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);
}

【讨论】:

  • 谢谢你,它很有帮助,但我不得不编辑这个问题,真的很感谢你的回答!
  • 不应该是if (++array[--size] != limit) 而不是if (++array[size] != limit) 吗?
  • @user2199158 我在算法中使用 C 索引,它是从 0 开始的。所以循环中的第一条语句使索引正确。 IE。如果数组大小为 10,则索引为 [0..9]。如果您有不同的索引方案,请根据需要进行调整。只需在第一次使用前确保索引值正确即可。
  • 是的,我知道,但这不是在测试if (++array[10]!= limit) 吗?
  • 哦,你在 if (!filter[--size]) 中减少了它......对不起:)
【解决方案2】:

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

int base = 3;

for( int i = (sizeof( array ) / sizeof( array[0] ))-1; i >= 0; )
{
    if( ++array[i] < base )
        break;
    else
        array[i--] = 0;
}

【讨论】:

  • 如果你想假设数组不包含预初始化的值,是的。
  • 如果数组是预初始化的,如果 array[i-1] 元素显式地为 0,你将覆盖该值。另一方面,如果你将 1 加到一个已经有值的数字上,你会通过分配 0 来“破坏”初始值。
【解决方案3】:

这相当于简单地递增自然数,从 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 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多