2

我用 C 语言编写了一个程序,它打印表示输入数字(逐位)的英文,例如,当您输入 时938,它会打印出nine three eight 当输入太大(超过 9 位)时它不起作用。谁能向我解释为什么会这样?我尝试使用 unsigned int 而不是 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

C中 s 的标准表示int是有限的。基本上,您有8 * sizeof (int)可用的位(比如说32)。有了32可用的位,anunsigned int可以与任何大于此的数字一样2^32 - 14294967295

您可以尝试,unsigned long long但这仍然是有限的。或者,您可以尝试使用BigNum库。

但是,对于您的具体问题,将数字作为字符串读取并作用于该字符串的每个字母就足够了。

于 2012-10-17T06:06:00.110 回答
1

根据我收集的信息,您实际上并不需要将其存储在int. 将其存储为字符串(char[]),然后显示每个数字。

您实际上可以完全删除数组,并在输入每个数字时打印每个数字的单词表示,然后丢弃它。

于 2012-10-17T06:32:23.097 回答
1

一个int罐头(通常)只能保存一个 32 位数字,因此它仅限于存储范围内的数字[-2147483648, 2147483647]。因此,它适用于任何 9 位数字,但对大多数 10 位数字无效。

与其将数字放在 中int,不如只读取每个数字一次(例如,使用getc)并分别处理它们?然后您可以轻松处理任何大小的数字,而无需使用字符串。

于 2012-10-17T06:04:54.900 回答
0

一个整数由 32 位组成。如果输入大于 2^32 的数字,它将不起作用。尝试从用户那里获取字符串而不是整数。

您还可以使用unsigned long long int,它是一个 64 位变量。

于 2012-10-17T06:03:46.877 回答