我正在尝试学习如何在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);
}
答案 0 :(得分:1)
每种编程语言中的每种类型的值都有一个限制。在您的情况下,32位整数变量可以处理最大值2,147,483,647。除此之外的任何事情都会导致错误。
答案 1 :(得分:1)
12040678091
是&gt; 2**31
,您的整数可能是32位,scanf
无法正确处理溢出。所以它只适用于int
。
您使用的示例适合unsigned long long
或uint64_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
整数。