2010-12-02 4 views
0

나는 약간의 비범한데, 아마도 약간의 downvotes를 요구할 것이다. 그러나 1 시간 만에 끝날 것이기 때문에 어디에서 시작 해야할지 모르겠다. 나는 너희들에게 물어볼 줄 알았다.C 숙제 - 줄 루프 교체

는 기본적으로 나는 예를 들어, + 형태로 자리 표시자를 포함 된 문자열을 제시하고 있습니다 :

1+2+5 

나는 밖으로 인쇄에 주어진 일련의 서로 다른 조합을 배치의 모든 가능성을하는 함수를 만들어야합니다 자릿수는입니다. 나는. 일련의 경우 :

[9,8,6] // string array 

출력 I 얻을 각 입력 (자릿수)^(자리 수)의 출력 라인 그래서

16265 
16285 
16295 
18265 
18285 
18295 
19265 
19285 
19295 

것이다. 숫자는 0-9이며 숫자 문자열의 최대 형식은 [0,1,2,3,4,5,6,7,8,9]입니다. 원래 문자열에는 많은 자리 표시자가있을 수 있습니다 (출력이 매우 길어질 수 있다고 기대할 수 있음).

C에서 반복적으로 수행해야합니다. 다시 한 번 정말 감사의 말을 전하고 싶습니다.

아이디어를 제공 할 수 있다면 다른 언어 또는 재귀 적으로도이를 해결할 수있는 간단한 방법을 사용해도 괜찮을 것입니다. 일반적인 개념을 사용하고 거기에서 이동할 수 있습니다.

+0

이 프로그램을 C++로 작성하는 데 30 초가 걸리지 만 그 당시 C를 분해 할 수는 없습니다. 죄송합니다. – Puppy

+0

C++도 훌륭합니다. 어떻게 든 번역해야합니다. 도와주세요! – Gal

+1

왜 재귀를 방지 하시겠습니까? 이 문제는'nCr'의 모든 가능성을 계산하는 것으로 줄일 수 있습니다. 여기서'n'은 + 기호의 수이고'r'은 시리즈의 숫자입니다. 이것은 재귀 적으로 가장 쉽게 해결됩니다. –

답변

1

다른 순서로 인쇄하지만 중요하지 않습니다. 재귀 적이 아닙니다. 실제 교환을하기 위해

#include <stdlib.h> 
#include <stdio.h> 

int // 0 if no more. 
get_string(char* s, const char* spare_chr, int spare_cnt, int comb_num){ 
    for (; *s; s++){ 
     if (*s != '+') continue; 
     *s = spare_chr[comb_num % spare_cnt]; 
     comb_num /= spare_cnt; 
    }; 
    return !comb_num; 
}; 

int main(){ 
    const char* spare_str = "986"; 
    int num = 0; 
    while (1){ 
     char str[] = "1+2+5"; 
     if (!get_string(str, spare_str, strlen(spare_str), num++)) 
      break; // done 
     printf("str num %2d: %s\n", num, str); 
    }; 
    return 0; 
}; 
+0

왜 모든 옵션이 아닌 첫 번째 옵션 만 출력하는지 알고 있습니까? – Gal

+0

모두입니다. (단지'#include '이 실제로 컴파일되도록). – ruslik

+0

내가 작성한 정확한 순서가 필요합니다. 그들은 결과를 그것들과 비교합니다. – Gal

0

, 당신은 문자의 첫 번째 항목을 찾아 그것에 char * 포인터를 반환하는 strchr를 사용할 수 있습니다. 그런 다음 포인터의 값을 변경하고 문자 교체를 수행했습니다.

strchr은 (널 종결 자 앞에) 첫 번째 항목을 검색하므로 바꿀 모든 값에 대해 반복적으로 사용할 수 있습니다.

루프가 좀 더 까다 롭지 만, 당신이 무엇을 만드는지 보자.