浙大版《C语言程序设计(第4版)》题目集参考答案
本题要求实现一个统计整数中指定数字的个数的简单函数。
函数接口定义:
int CountDigit( int number, int digit );
其中number
是不超过长整型的整数,digit
为[0, 9]区间内的整数。函数CountDigit
应返回number
中digit
出现的次数。
裁判测试程序样例:
#include <stdio.h>
int CountDigit( int number, int digit );
int main()
{
int number, digit;
scanf("%d %d", &number, &digit);
printf("Number of digit %d in %d: %d\n", digit, number, CountDigit(number, digit));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
-21252 2
输出样例:
Number of digit 2 in -21252: 3
提交结果:
基本思路:
***函数递归:>函数自己调用自己***
***整数除以10结果取整,去掉整位的最低位,整数取10的余,余数是整数的最低位***
***负数取余的(非0)余数都是负数***
***缺陷:>整数为全零时无论指定位数是任何一个数,只有记为一,都可以跑对***
1.创建变量统计指定数字的个数
2.给出的整数是负数,可以先转为正数,也可以不转正数而是在判断尾数的值时,增加一个逻辑或余数等于负指定位数,也可以直接函数递归。
3.返回结果
代码实现:
1.递归
int CountDigit(int number, int digit)
{
if (number == 0)//全0记出现的1次
{
return 1;//返回1
}
else//不为0
{
if (number / 10 != 0)//还有两位及以上
{
if (number % 10 == digit || number % 10 == -digit)//存在指定数字
{
return 1 + CountDigit(number / 10, digit);//加一递归
}
else//不存在
{
return CountDigit(number / 10, digit);//直接递归
}
}
else//仅有一位
{
if (number == digit || number == -digit) {存在指定数字
return 1;//返回1
}
else//不存在
{
return 0;//返回0
}
}
}
}
2.转正数
int CountDigit(int number, int digit)
{
int count = 0;//统计指定数字的个数
if (number < 0)//当输入整数为负数
{
number = -number;//负数转正数
}
if (number == 0)//当输入整数为0
{
if (number == digit)//指定数字是0
{
count = 1;//计为1个
}
else//不是指定数字
{
count = 0;计为0个
}
}
while (number)//统计整数中指定数字的个数
{
if (number % 10 == digit)//末尾数字的值
{
count++;//指定数字的个数加一
}
number /= 10;//去掉末尾一位
}
return count;
}
3.不转正数
int CountDigit(int number, int digit)
{
int count = 0;//统计指定数字的个数
if (number == 0)//当输入整数为0
{
if (number == digit)//指定数字是0
{
count = 1;//计为1个
}
else//不是指定数字
{
count = 0;计为0个
}
}
while (number)//统计整数中指定数字的个数
{
if (number % 10 == digit || number % 10 == -digit)//末尾数字的值
{
count++;//指定数字的个数加一
}
number /= 10;//去掉末尾一位
}
return count;
}
欢迎提问和纠错,共同讨论一起进步!