2016-10-06 4 views
0

그래서 0000000000과 ZZZZZZZZZZ 사이에 가능한 모든 영숫자 조합을 실행하는 프로그램이 있습니다. 현재이 코드 사용하고 있습니다 :이러한 for 루프를 어떻게 단축합니까?

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 중첩하고 내 전체 편집기 화면이 가득합니다. 그러면 이것을 어떻게 하나 또는 두 개의 루프로 압축할까요? digit[i]을 테스트하고 증분하는 방법을 함께 모을 수는 없습니다. 이 솔루션을 사용하는 모든 사용자에게 미리 감사드립니다. 이 사이트에는 백만 개의 웹 페이지가 있지만 Google 검색에서 문구를 사용하는 방법을 생각할 수는 없습니다.

+3

당신은이 비현실적 –

+0

http://www.catb.org/jargon/html/R/recursion.html – wildplasser

+0

@OlegAndriyanov 그래, 영원히 소요, 그건 하나의 이유를 만들어 관련 조합의 수를 실현 할 더 좋은 방법이 필요합니다. –

답변

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

초기 호출은'SIZE-1'이어야합니다. – Barmar

+0

숫자 나 문자를 출력하는 함수를 만들었습니다. 이 코드에 어디에서 추가해야합니까? –

+2

'do stuff ... ' – Barmar

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

'pow (36,10)'이'MAX_INT '보다 크기 때문에'for()'루프는 32 비트 시스템에서는 작동하지 않으므로'i Barmar

+0

@Barmar 흥미로운 점. 'pow'는'double'을 반환합니다. AFAIK는'int'와'double'을 비교하면'double'으로 캐스팅됩니다. 그래서'int'를'double'으로 캐스팅 할 때 정밀도 손실로 인해 중복 (또는 누락) 반복이 발생할 가능성이 더 큽니다. –

+1

결국'i'는'MAX_INT'에 도달 할 것이고, 다음 반복은'i ++'를 할 것이고 당신은'i'의 오버 플로우를 얻을 것입니다. – Barmar