在C中的递归函数 - 无法处理大输入[计数为零]

问题描述:

我想学习如何在C中编写递归函数,并且我编写了这个函数来计算指定正数中的零的数量,作为练习。但是,它只能处理最大长度为10的输入。有11个或更多数字的输入失败,我不明白为什么。在C中的递归函数 - 无法处理大输入[计数为零]

Ex。

input = 1204067809 (correct) 
output = 3 

input = 12040678091 (fails!!) 
output = 0 

input = 120406780914234(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); 
} 
+2

您的值不符合整数。试试'long long' –

+0

你的程序也可能会失败,并输入10位数字,例如'2147483647 + 1' –

12040678091>2**31,您的整数可能是32位,而scanf不能正确处理溢出。所以它不适用于int

您使用的示例适用于unsigned long longuint64_t。然而,我建议使用字符串方法:不要转换为整数,只需通过char解析来计算零,然后就可以处理任何整数大小(如果字符串缓冲区足够大,那么是)

(用递归函数计算字符串中的字符现已正式矫枉过正,但可以做到为研究目的,通过传播字符串的索引,而不是分开的值)

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

我假设你编译器声明,int为4字节变量。 您的号码应该是范围之间:

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

如果你想使用long long整数尝试执行该操作。