【问题标题】:A C program does not work when input number is too large输入数字太大时 C 程序不工作
【发布时间】:2012-10-07 08:11:54
【问题描述】:

我用 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;

}

【问题讨论】:

  • 9 位大约是 32 位整数的限制。

标签: c algorithm memory memory-management types


【解决方案1】:

据我所知,您实际上并不需要将其存储在 int 中。将其存储为字符串(char[]),然后显示每个数字。

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

【讨论】:

    【解决方案2】:

    ints 在 C 中的标准表示是有限的。基本上,您有可用的8 * sizeof (int) 位(比如说32)。有32 位可用,unsigned int 可以与2^32 - 1 一样大,即4294967295 任何大于此的数字都是不行的。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 32 取决于平台。
      【解决方案4】:

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

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

      【讨论】:

      • 32 和 64 取决于平台。
      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多