在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);
}
答
12040678091
>2**31
,您的整数可能是32位,而scanf
不能正确处理溢出。所以它不适用于int
。
您使用的示例适用于unsigned long long
或uint64_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
整数尝试执行该操作。
您的值不符合整数。试试'long long' –
你的程序也可能会失败,并输入10位数字,例如'2147483647 + 1' –