문제

나는 이것이 "수천", "백"등과 같은 것을 사용하여 숫자를 단어로 변환하는 프로그램과 다소 유사하다는 것을 알고 있습니다. "5 개의 세 셋 1 Zero". 나는 내가 완전히 이해하고 일하고 있다고 생각하는 스위치 문을 사용하고 있습니다. 나는 일종의 루프를 사용하여 정수의 각 숫자를 단일화하고 단어를 인쇄 한 다음 다음 자리를 반복하고 다음 숫자를 반복하는 데 갇혀 있습니다. 나는이 모든 것에 대해 상당히 새롭기 때문에 모든 도움이 감사하겠습니다! 감사.

여기에 내가 지금까지 가지고있는 것이 있습니다 (별로는 아니지만 루프로 어디로 갈지 어디에 갇혀) :

#include <stdio.h>

int main(void)
{
        int num;

        printf("Please enter an integer: \n");
        scanf("%d", & num);

        while (num==0)
        {
        switch (num)
        {
                case (0):
                        printf("Zero ");
                        break;
                case (1):
                        printf("One ");
                        break;
                case (2):
                        printf("Two ");
                        break;
                case (3):
                        printf("Three ");
                        break;
                case (4):
                        printf("Four ");
                        break;
                case (5):
                        printf("Five ");
                        break;
                case (6):
                        printf("Six ");
                        break;
                case (7):
                        printf("Seven ");
                        break;
                case (8):
                        printf("Eight ");
                case (8):
                        printf("Eight ");
                        break;
                case (9):
                        printf("Nine ");
                        break;
                case (10):
                        printf("Ten ");
                        break;

        }
        }
        return 0;

}
도움이 되었습니까?

해결책 2

이를 수행하는 가장 쉬운 방법은 정수 부서 "/"& "%"를 사용하여 오른쪽에서 숫자를 소비하는 것입니다.

다음은 몇 가지 부분 코드입니다.

int digit;
//start a loop
//if num > 10
digit = num % 10;
num = num / 10;
//else
digit = num;
//break the loop

숫자를 오른쪽에서 왼쪽으로 인쇄합니다. 왼쪽에서 오른쪽으로 원한다면 Num> 10이면 NUM / 10의 매개 변수로 호출 한 다음 숫자 값을 인쇄하는 재귀 함수를 만들 수 있습니다.

편집 : 재귀 기능의 예는 다음과 같습니다.

void convertToWords (int num){
    if (num > 10){
        convertToWords(num / 10);
    int digit = num % 10;
    //your switch statement to print the words goes here
}

다른 팁

따라서 문자열이있는 문자열을 읽고 문자열의 끝까지 (또는 내 예제 코드에서와 같이, 숫자 끝까지)와 숫자 이름을 인쇄 할 수 있습니다.

#include <stdio.h>

char *names[10] = {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", };
int main()
{
    char buffer[500] = {0};
    int i = 0;
    fgets(buffer, sizeof(buffer), stdin);
    while (isdigit(buffer[i]))
        printf("%s ", names[buffer[i++] - '0']);

    return 0;
}

http://ideone.com/ba7rs3

가장 이해하기 쉬운 방법 IMO (가장 효율적이지 않은 경우)는 10의 전력을 사용합니다. 우리가 숫자로 시작하면 543210, 그런 다음 숫자 수는 다음과 같습니다 log10(543210) + 1 = 6. 그런 다음

// start with a number
int num = 543210;
// how many digits?
int digits = log10(num) + 1; // 6
// now loop through each digit
for (int i = digits - 1; i > 0; --i) {
  int p = (int)pow(10, i);
  int digit = (num / p) % 10; // we want integer division
  switch (digit) { ... }
}

(기억해 #include <math.h>.)

가능한 한 가지 방법 :

#include <stdio.h>

char *digits[10] = {
  "Zero", "One", "Two", "Three", "Four",
  "Five", "Six", "Seven", "Eight", "Nine"
};

int main() {
  int num, digit; 
  long long tenth = 1;
  printf("Please enter an integer: \n");
  scanf("%d", &num);

  while (tenth < num) {
    tenth *= 10;
  }

  while (tenth > 1) {
    tenth /= 10;
    digit = num / tenth;
    num %= tenth;
    printf("%s ", digits[digit]);
  }
  return 0;
}

데모. 이제 설명을 위해 :

무엇보다도 사용하는 것은 의미가 없습니다. switch 여기 : 숫자는 특성에 따라 꽤 대담하기 때문에 이름은 대신 문자열 배열에 저장 될 수 있습니다 (char *digits[10] 이 코드에서). 그런 다음이 숫자를 색인으로 사용 하여이 배열에 액세스하면 특정 숫자에 대한 레이블을 얻을 수 있습니다.

둘째,이 프로그램의 주요 문제는 각 숫자를 입력에서 별도로 추출하는 것입니다. 오른쪽에서 왼쪽으로가는 것이 더 쉽습니다 (결과를 얻으십시오. number % 10, 할당 number / 10 에게 number, 반복), 그러나 여기에서 일은 다른 방식으로 왼쪽에서 오른쪽으로 이루어져야합니다. 이것이 우리가하는 일입니다.

  • 계산하다 tenth - 주어진 숫자보다 큰 10의 첫 번째 힘 (예 : 546에서 일하는 경우 1000).
  • 각 후속 반복에서 :

-- 나누다 tenth 10

- 정수 부서의 결과를 처리하십시오 number ~에 의해 tenth

- 다시 할당하십시오 number 나머지 number 로 나눈 tenth

첫 번째 반복에서 tenth 100 (1000/10), 546/100은 5를 제공합니다 (정수로 나뉘어진 정수는 정수, 소수점은 잘립니다), 546 % 100은 46을 제공합니다. 이는 두 번째 반복의 숫자로 저장됩니다.

두 번째 반복에서 tenth 10 (100/10), 46/10은 4, 46 % 10을 제공합니다. 6. 다음주기 : 10/10 => 1, 6/1 => 6, 6 % 1 => 0입니다. tenth 모든 숫자가 처리되면서 1과 동일하고 루프가 중지됩니다.

@Hayri Uğur Koltuk에서 영감을 얻은 한계 없음 솔루션

#include <ctype.h>
#include <stdio.h>
int main() {
  int ch;
  while (((ch = getc(stdin)) != EOF) && (isdigit(ch))) {
    static const char *Digit[10] = { "Zero", "One", "Two", "Three", "Four",
        "Five", "Six", "Seven", "Eight", "Nine" };
    printf("%s ", Digit[ch - '0']);
  }
  puts("\n");
  return 0;
}

간단한 재귀 솔루션

static void PrintDigit(unsigned n) {
  static const char *Digits[10] = {
    "Zero", "One", "Two", "Three", "Four",
    "Five", "Six", "Seven", "Eight", "Nine" };
  if (n > 9) {
    PrintDigit(n/10);
  }
  printf("%s ", Digits[n%10]);
}

void PrintDigits(unsigned n) {
  PrintDigit(n);
  printf("\n");
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top