我如何缩短这些for循环?

时间:2016-10-06 21:48:58

标签: c for-loop increment

所以我有一个程序贯穿0000000000和ZZZZZZZZZZ之间的每个可能的字母数字组合。目前我正在使用此代码:

for (digit[0] = 0; digit[0] < 36; digit[0]++)
    for (digit[1] = 0; digit[1] < 36; digit[1]++)
        for (digit[2] = 0; digit[2] < 36; digit[2]++)
            // etc...

...最终有10个嵌套for循环,我的整个编辑器屏幕都被填满了。那么我如何将它压缩成一个或两个for循环呢?我无法找出如何将它们放在一起测试和递增digit[i]。提前感谢任何拥有此解决方案的人。我打赌这有一百万个网页,但我想不出如何在谷歌搜索中对它进行短语。

2 个答案:

答案 0 :(得分:2)

使用里程表算法。增加最后一位数。当它达到最高值时,将其换回0并递归剩余的数字,直到数字用完为止。

int increment_digit(int array[], unsigned int index, limit) {
    if (index == -1) { // We've wrapped around the entire set
        return 0;
    }
    array[index]++;
    if (array[index] == limit) {
        array[index] = 0;
        return increment_digit(array, index-1, limit);
    } else {
        return 1;
}

int main(int argc, char **argv) {
    int digits[SIZE] = {0};
    while (1) {
        // do stuff ...
        if (!increment_digit(digits, SIZE-1, 36))
            break;
        }
    }
    return 0;
}

答案 1 :(得分:0)

这是一个使用递归函数的解决方案。您可能需要稍微调整一下,因为我必须假设一些事情 - 比如您正在使用的阵列类型。

另外,请注意,如果for循环运行的次数太多,这将会溢出。

void incDigit(int *digits) {
  digits[0]++;
  if(digits[0] >= 36) {
    digits[0] = 0;
    incDigit(digits + 1);
  }
}

int digits[10];
int i, j;
for(i = 0; i < (int)pow(36, 5); i++) {
  for(i = 0; i < (int)pow(36, 5); i++) {
    //Code here  
    incDigit(digits);
  }
}