C中的递归函数 - 无法处理大输入[count count 0]

时间:2017-09-27 04:41:14

标签: c recursion count

我正在尝试学习如何在C中编写递归函数,并且我编写了这个函数来计算指定正数中的零个数,作为一种实践。但是,它只能处理最大长度为10的输入。输入11个或更多数字失败,我不明白为什么。

实施例。

input = 1204067809 (correct)
output = 3

input = 12040678091 (fails!!)
output = 0

input = 12040678091423401231 (fails!!)
output = 1

代码:

#include <stdio.h>
int rCountZeros1(int num); 

int main()
{
  int number;
  printf("Enter the number: \n");
  scanf("%d", &number);
  printf("rCountZeros(): %d\n", rCountZeros(number));
  return 0;
}

int rCountZeros(int num) 
{  
  if (num==0)
    return 1;
  else if (num<10)
    return 0;

  if (num % 10 == 0)
    return 1+rCountZeros(num/10);
  else
    return rCountZeros(num/10);
}

3 个答案:

答案 0 :(得分:1)

每种编程语言中的每种类型的值都有一个限制。在您的情况下,32位整数变量可以处理最大值2,147,483,647。除此之外的任何事情都会导致错误。

答案 1 :(得分:1)

12040678091是&gt; 2**31,您的整数可能是32位,scanf无法正确处理溢出。所以它只适用于int

您使用的示例适合unsigned long longuint64_t。但是,我建议使用字符串方法:不要转换为整数,只需通过char解析来计算零,并且你将能够处理任何整数大小(好吧,如果你的字符串缓冲区足够大,那么是)

(用递归函数计算字符串中的字符现在正式矫枉过正,但可以通过传播字符串的索引而不是分割值来完成研究目的)

答案 2 :(得分:0)

我假设您的编译器将int声明为4字节变量。 您的电话号码应在以下范围内:

signed  : -2,147,483,648 to 2,147,483,647
unsigned: 0 to 4,294,967,295

如果要执行操作,请尝试使用long long整数。