2017-12-29 8 views
2

첫 번째로, 영어를 유감스럽게 생각하며, 충분히 설명하지 못한다면. 내 코드의 출력을 통해 그 아이디어가 무엇인지 알 수 있기를 바랍니다. 문제는 내가 만든 방식으로 최대 999 (3 자리 숫자)까지만 작동한다는 것입니다. 나는 거기에 얼마나 많은 자릿수가 있는지 신경 쓰지 않고 그냥해야 할 일을하는 루프가 있어야한다고 생각한다.C 프로그램이 반올림에서 증가하는 숫자를 찾아야합니다.

int main(){ 
int n, m, k, digit1, digit2, digit3, p, a = 0; 
do{ 
    printf("Enter m and n (m < n):\n"); scanf("%d %d", &m, &n); 
    if (m < n) { 
     break; 
    } 
    else printf("\Error - m > n! Try again.\n\n"); 
} while (a == 0); 

printf("Output:\n"); 
for (k = m; k <= n; k++){ 
    p = k; 
    do{ 
     digit3 = p % 10; //123 % 10 = 3   13%10 = 3 == p/10 +1 
     digit1 = p/100; //123/100 = 1 
     digit2 = (p/10) % 10; // (123 /10) = 12%10 = 2 
     if (p > 100){ 
      if (digit2 == digit1 + 1 && digit3 == digit2 + 1){ 
       printf("%d ", k); 
      } break; 
     } 
     if (digit3 == ((p/10) + 1)) { 
      printf("%d ", k); 
     } break; 
     p = p/10; 
    } while (p > 0); 
} 
getch(); 
return 0; 
} 

예 출력 :

Enter m and n (m < n): 
    1 999 
    Output: 
    1 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789 

이 출력이 정확하고 프로그램을 수행하는 것입니다. 불행하게도 999 이상에서 작동하도록 루프를 만들 수 없습니다. 사용자가 입력 한 간격으로 각 숫자가 이전보다 1 씩 큰 모든 숫자를 출력해야합니다.

+0

당신의 접근 방식은 대신 배열의 개별 변수를 사용하고 있기 때문에, 확장되지 않습니다. 배열은 여기에 설명되어 있습니다. https://en.wikibooks.org/wiki/C_Programming/Arrays_and_strings –

+2

"내 코드의 결과물로 인해서 무엇에 관한 아이디어를 얻을 수 있기를 바랍니다." 아닙니다. 나는 당신의 문제를 짐작하고 싶지 않다. 유효한 번호는 무엇입니까? 왜 1은 괜찮습니까? 2 또는 3은 아닙니다. 질문을 편집하여 문제를 명확히 진술하십시오. –

+0

유효한 숫자는 12 23과 같이 오름차순 숫자가있는 숫자입니다. 123 등 –

답변

2

가 여기에 내 걸릴 것입니다. 문제를 부분으로 나눕니다. 숫자가 "증가"하는지 확인하는 함수가 필요합니다. 즉, 기본 10 표현의 모든 숫자가 다음의 10의 거듭 제곱에 해당하는 것이고, 가장 큰 0이 아닌 숫자까지의 숫자입니다 . (이 개념을 형식적으로 표현하는 것보다 더 열심히).

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

bool growing(unsigned int x) 
{ 
    //if (x < 10) 
    // return false; 
    unsigned int last = x % 10 + 1; 
    while (x>0) { 
     unsigned int cur = x % 10; 
     x /= 10; 
     if (cur != last-1) 
      return false; 
     last = cur; 
    } 
    return true; 
} 

int main(void) 
{ 
    unsigned int m = 1; 
    unsigned int n = 123456789; 

    for (unsigned int i = m; i <= n; ++i) { 
     if (growing(i)) { 
      printf("%i ", i); 
     } 
    } 
} 

하나의 숫자를 수락할지 여부를 결정해야합니다. 그렇다면 첫 번째 두 줄의 주석 처리를 제거하십시오.

는 분명히 가장 높은 증가는 123456789

편집 : 직접으로 함수를 이동 인해 기능 버전은 루프 :

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

int main(void) 
{ 
    unsigned int m = 1; 
    unsigned int n = 123456789; 

    for (unsigned int i = m; i <= n; ++i) { 
     unsigned int x = i; 
     bool growing = true; 
     //if (x < 10) 
     // growing = false; 
     unsigned int last = x % 10 + 1; 
     while (x>0) { 
      unsigned int cur = x % 10; 
      x /= 10; 
      if (cur != last - 1) 
       growing = false; 
      last = cur; 
     } 

     if (growing) { 
      printf("%i ", i); 
     } 
    } 
} 

당신은 휴식 후와 약간 빠른 버전을 얻을 수 있습니다 거짓으로 성장하는 설정.

쓸모없는 호언 : 학생들이 기본 자료를 이해하기 전에 왜 사람들이 I/O를 계속 가르치는 지 이해할 수 없습니다. 기능을 가르치지 않고, 그것을 깨닫지 않고 하나 (main)를 작성하고, 포인터에 대해 모르는 사이에 다른 사람 (scanf, printf)에게 전화하십시오. 선생님이 어떻게 &을 정당화하는지 궁금합니다.

+0

을 꼭 추가해 주셔서 감사합니다. 우리는 아직 기능을 연구하지 못했고, 스스로 체크해야 할 것입니다. –

+0

@JustSteve "기능이없는"버전으로 내 대답을 편집했습니다. 다른 사람들이 알 수 있도록 대답을 표시하는 것을 잊지 마십시오. –

+0

완료. 고마워요! –

2

한 번에 모든 자릿수를 추적 할 필요가 없습니다. 당신이 체크 할 필요가 마지막 숫자가 같은 두 번째 마지막

뭔가 이상 더 많은 것을 아마도

int main(){ 
int n, m, k, digit1, digit2, digit3, p, a = 0; 
do{ 
    printf("Enter m and n (m < n):\n"); scanf("%d %d", &m, &n); 
    if (m < n) { 
     break; 
    } 
    else printf("\Error - m > n! Try again.\n\n"); 
} while (a == 0); 

printf("Output:\n"); 
k = m; 
while(k++ <= n){ 
    int p = k; 
    int flag = 0; 
    int num; 

    while(p > 10){ 
     // Get the last digit 
     // in case of 123 -> 3 
     num = p % 10; 
     // Reduce p by 10 
     // 123 -> 12 
     p = p/10; 
     // check 3 == 12%10 + 1 
     // if this is correct go back to start of the loop 
     // we may have more digits 
     if(num == p % 10 + 1) continue; 
     // So the digits dont match, set the flag 
     // break out of the loop 
     flag = 1; 
     break; 
    }  
    // Outside the loop check the flag and print 
    if(k > 10 && !flag) 
     printf("%d ",k); 
} 
return 0; 
} 
+0

작동하지 않는 것 같습니다. 나는 몇 가지 물건을 바꾸려고 노력했지만 여전히 작동하지 않습니다. :/ –

+0

@JustSteve 무엇이 작동하지 않습니까? – qwn

+0

아무 것도 출력하지 않습니다. –

0

여기에서 문제에 대한 해결 방안입니다. 그것은 문자열이 아닌 숫자와 함께 작동, 따라서 효율성이 떨어집니다하지만 어쩌면 쉽게 이해하기 위해 다음과 같은 이유로,

Enter m and n (m < n): 
1 999 
Output: 
1 2 3 4 5 6 7 8 9 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789 

내가 실제 규칙이 무엇인지 궁금 :

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

int main() 
{ 
    int m, n, i, j; 
    char buf[20], c, last; 
    _Bool ascending; 

    puts("Enter m and n (m < n):"); 
    scanf("%d %d", &m, &n); 
    if (m >= n) { 
     fprintf(stderr, "m must be smaller than n"); 
     exit(EXIT_FAILURE); 
    } 

    puts("Output:"); 
    for (i = m; i < n; i++) { 
     sprintf(buf, "%d", i); 
     ascending = true; 
     last = 0; 
     for (j = 0; buf[j] != 0; j++) { 
      c = buf[j]; 
      if (last != 0 && last != c - 1) { 
       ascending = false; 
       break; 
      } else { 
       last = c; 
      } 
     } 
     if (ascending) { 
      printf("%d ", i); 
     } 
    } 

    return EXIT_SUCCESS; 
} 

그러나, 출력의 약간 다른 모습 2와 9 사이의 숫자는 1보다 다소 오름차순으로 표시됩니다.

그리고 여기에 더 큰 수에 대한 출력입니다 :

Enter m and n (m < n): 
1 10000 
Output: 
1 2 3 4 5 6 7 8 9 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789 1234 2345 3456 4567 5678 6789 
+0

그래, 문제는 출력이 100 %가 아니기 때문입니다. 규칙을 설명하고 번역하는 더 좋은 방법을 찾지 못했습니다. 나는 그것이 무엇을 해야하는지 이해할 수 없었다. (내 언어로) 교사에게 "예를 들어 1234와 같은 숫자를 출력해야한다"고 물었다. 처음에는 어떤 이유로 20에서 40과 같이 출력해야한다고 생각했습니다. 23 24 25 26 27 28 29 34 35 36 37 38 39. –

+0

규칙이 완전히 명확하지 않은 한, 1이 정확해야하며 2에서 9까지의 숫자가 올바르지 않아야합니다. 또는 숫자가 적어도 두 개의 숫자로 구성되어 있고 if (strlen (buf) <2) continue;를 첫 번째 for 루프에 추가하는 경우에만 규칙이 수행된다고 주장 할 수 있습니다. 편집 :'#include ' –

0

그래서 여기 연산에 따라 다른 버전의 :

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

_Bool only_consecutive_figures(int number) 
{ 
    int figure, last; 

    for (last = 0; number > 0; number /= 10) { 
     figure = number % 10; 
     if ((last != 0 && last != figure + 1) || figure == 0) { 
      return false; 
     } 
     last = figure; 
    } 

    return true; 
} 

int main() 
{ 
    int m, n, i; 

    puts("Enter m and n (m < n):"); 
    scanf("%d %d", &m, &n); 
    if (m >= n) { 
     fprintf(stderr, "m must be smaller than n"); 
     exit(EXIT_FAILURE); 
    } 

    puts("Output:"); 
    for (i = m; i < n; i++) { 
     if (only_consecutive_figures(i)) { 
      printf("%d ", i); 
     } 
    } 
    putchar('\n'); 

    return EXIT_SUCCESS; 
} 
관련 문제