5

C言語で任意の正の整数の数字を表示するコードを書いています。たとえば、整数345は345として表示されます。

私が書いたコードは、すべての桁が0より大きい整数に対しては正常に機能します。ただし、10、304、0などの特定の整数は正しく表示されません。チャレンジのために再帰と配列を使用することは許可されていません。ループとif構文のみが許可されます。助言がありますか?

#include<stdio.h>
int main(void)
{
    int num, num_copy, accum = 1;

    printf("Enter an integer ");
    scanf("%i",&num);

    num_copy = num;

    while (num > 0){

    while (num > 9){
        num = num / 10;
        accum *= 10;
        }
        switch (num){

        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 ");
                break;
        case (9):
                printf("nine ");
                break;
        }
        num_copy = num_copy - (num*accum);
        num = num_copy;
        accum = 1;
    }

    return 0;
}
4

5 に答える 5

2

再帰関数を作成すると、逆の順序で印刷するために使用するループを回避するのに役立ちます。

#include<stdio.h>

void print_num(int num)
{
if(num == 0) return;
print_num(num/10);

        switch (num%10){

        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 ");
                break;
        case (9):
                printf("nine ");
                break;
        case (0):
                printf("zero ");
                break;
        }
}


int main(void)
{
    int num, num_copy, accum = 1;

    printf("Enter an integer ");
    scanf("%i",&num);
    print_num(num);

    return 0;
}

配列を使用して数値を格納する非再帰的ソリューション:

void print_num(int num)
{
int i=0,j;
int arr[256];

while(num)
{
arr[i++]=num%10;
num/=10;
}

for(j=i-1; j>=0;j--)
{
        switch (arr[j]){

        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 ");
                break;
        case (9):
                printf("nine ");
                break;
        case (0):
                printf("zero ");
                break;
        }
}
于 2012-11-15T15:35:04.517 に答える
2

ああ!これは楽しそうですね!配列も再帰もありませんよね?

したがって、再帰を使用できないため、数値を逆方向に作成する必要があります。

#include<stdio.h>
int main(void)
{
    int num, backwards = 0, digit, backupzeros = 0;

    printf("Enter an integer ");
    scanf("%i",&num);            // get the number

    while(num > 0){
        digit = num % 10;    // pry off the last digit
        num /= 10;           // take off the digit

        if((backwards == 0) && (digit == 0))    // If it's a number that ends in 0
            backupzeros++;                   // save it, we'll use that later

        backwards = (backwards * 10) + digit; // glue it on backwards
    }

    // Now we have the number reversed. Next we need to print the digits

    while (backwards > 0){
        digit = backwards % 10;
        backwards /= 10;

        switch (digit){

        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 ");
                break;
        case 9:
                printf("nine ");
                break;
        default:
                printf("zero ");
                break;
        }
    }

    while(backupzeros > 0) {
        printf("zero ");
        backupzeros--;
    }

    return 0;
}
于 2012-11-15T16:20:34.160 に答える
1

これは何年も前の大学の演習でした!!!

1から999までの整数

#define MAX_BUF 100

int main(){

    int num, i=0, j, digit;
    char *buf[MAX_BUF];

    printf("Integer: ");
    scanf("%d",&num);

    while(num){
        digit = num %10;
        num = num /10;

        switch(digit){
            case 0: buf[i++] = "zero"; break;
            case 1: buf[i++] = "one"; break;
            case 2: buf[i++] = "two"; break;
            case 3: buf[i++] = "three"; break;
            case 4: buf[i++] = "four"; break;
            case 5: buf[i++] = "five"; break;
            case 6: buf[i++] = "six"; break;
            case 7: buf[i++] = "seven"; break;
            case 8: buf[i++] = "eight"; break;
            case 9: buf[i++] = "nine"; break;
        }
    }

    for(j = i-1; j >= 0; j--){
        printf("%s-", buf[j]);
    }

    return 0;
}
于 2012-11-15T15:47:57.820 に答える
0

"(..)しかし、10、304、0"などの特定の整数、

これらすべての数字に共通するものは何ですか?「ゼロ」がその答えです。

ゼロも処理するための条件をスイッチに入れる必要があります。

あなたはこのようなことをすることができます:

#include<stdio.h>
int main(void)
{
    int num, num_copy, accum = 1;

    printf("Enter an integer ");
    scanf("%i",&num);

    char str[15];
   sprintf(str, "%d", num);


    for(num = 0; str[i] != '\O'; num++)
    {
      switch (num){

        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 ");
                break;
        case (9):
                printf("nine ");
                break;
        case (0):
            printf("zero ");
                break;
        }
    }

    return 0;
}

sprintf()整数をに変換するために使用できますchar []。次に、その配列を反復処理する必要があります。

于 2012-11-15T15:27:05.067 に答える
0

テストされていません...

char *digitNames[10] = {
    "zero",
    "one",
    ...   // Too lazy to fill in the rest..
    "nine"
}

void displayNumber(uint32_t number) {
    int totalDigits = 0;
    int scale = 10;
    uint32_t divisor = 1000000000;
    uint32_t digit;

    do {
        scale--;
        digit = number / divisor;
        number -= digit * divisor;
        divisor /= 10;
        if(scale == 0) {
            fputs(stdout, digitNames[digit]);
        } else if( (digit != 0) || (totalDigits != 0) )
            printf("%s ", digitNames[digit]);
            totalDigits++;
        }
    } while(scale != 0);
}
于 2012-11-15T16:15:27.493 に答える