当输入数字太大时,C程序不起作用

时间:2012-10-17 06:01:41

标签: c algorithm memory memory-management types

我在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 个答案:

答案 0 :(得分:2)

C中int的标准表示是有限的。基本上,您有8 * sizeof (int)位可用(让我们说32)。如果32位可用,则unsigned int可以与2^32 - 1一样大,4294967295任何大于此值的数字都不正常。

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

然而,针对您的具体问题,将数字作为字符串读取并对此字符串的每个字母进行操作应该足够了。

答案 1 :(得分:1)

int可以(通常)只保留32位数字,因此仅限于存储[-2147483648, 2147483647]范围内的数字。因此,它可以适用于任何9位数字,但对于大多数10位数字都不起作用。

不是将数字放在int中,为什么不一次一个地读取每个数字(例如getc)并单独处理它们?然后,您可以轻松处理任何大小的数字,而无需使用字符串。

答案 2 :(得分:1)

从我收集的内容来看,您并不需要将其存储在int中。将其存储为字符串(char[]),然后显示每个数字。

你可以完全删除数组,只需输入每个数字的单词表示,然后丢弃它。

答案 3 :(得分:0)

整数由32位组成。如果输入的数字大于2 ^ 32,则无效。尝试从用户获取字符串而不是整数。

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