2

たとえば、入力番号を表す英語を出力するプログラムを C で作成しました (桁ごとに)。たとえば、 を入力する938と出力さnine three eight れます。なぜこれが起こるのか、誰かが私に説明できますか? 変数に int の代わりに unsigned int を使用しようとしましたが、それでも機能しません。

#include <stdio.h>
/**
10/17/2012
Programming in C
Ch6 no. 6
Program doesn't work when number gets too large (>9 digits)
Print english that represents input number (digit by digit)
*/

int main(void){

int digit;//use to hold digit

int number;//hold input number

int revNumber = 0; //the reversed digit of the input number

int no_zero = 0;//number of zero needed to be printed at the end

int i = 1;//hold how many digits does the number have (+1 = i*10)

printf("Please enter a number\n");

scanf("%u", &number);

int testing = number;//a copy of input number for

//counts how many digits does the number have (+1 = i*10)

for(; testing != 0;i *= 10){

    testing /= 10;

}

//make the reversed number

do{

    i /= 10;

    digit = number % 10;

    if(digit == 0)

        no_zero++;

    revNumber += (digit*i);

    number /= 10;

}while(number != 0);


//print the result using the reversed number

do{

    digit = revNumber % 10;

    revNumber /= 10;

    switch(digit)

    {

     case 0:

     printf("zero ");

     no_zero--; //minus zero not at the end

     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 ");

     break;

     default:

     printf("nine ");

    }

}while(revNumber != 0);


//add back the ending zero

for(;no_zero!=0;no_zero--)

printf("zero ");

return 0;

}
4

4 に答える 4

3

intC での sの標準表現には制限があります。基本的に、8 * sizeof (int)利用可能なビットがあります (たとえば32)。使用32可能なビットがあれば、これよりも大きい任意の数unsigned intになる可能性があります。2^32 - 14294967295

試してみることはできますがunsigned long long、これはまだ制限されています。または、BigNumライブラリを使用してみることができます。

ただし、特定の問題については、数値を文字列として読み取り、この文字列の各文字に作用するだけで十分です。

于 2012-10-17T06:06:00.110 に答える
1

int(通常) 32 ビットの数値しか保持できないため、範囲内の数値の格納に制限されます[-2147483648, 2147483647]。したがって、任意の 9 桁の数字で機能しますが、ほとんどの 10 桁の数字では機能しません。

数字を に入れる代わりに、int各桁を一度に 1 つずつ (たとえば でgetc) 読み取り、別々に処理してみませんか? これにより、文字列を使用する必要なく、任意のサイズの数値を簡単に処理できます。

于 2012-10-17T06:04:54.900 に答える
1

私が集めたものから、実際にそれを保存する必要はありませんint. 文字列として保存(char[])し、各桁を表示します。

実際、配列を完全に削除し、入力中に各数字の単語表現を出力して破棄することができます。

于 2012-10-17T06:32:23.097 に答える
0

整数は 32 ビットで構成されます。2^32 より大きい数値を入力すると機能しません。整数の代わりにユーザーから文字列を取得してみてください。

64 ビット変数であるunsigned long long intを使用することもできます。

于 2012-10-17T06:03:46.877 に答える