函数接口定义:
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
问题分析
本题考察学生的思维能力和基本函数知识
通过读题我们可知,大概存在以下问题
1.计算在number中出现的digit数字的数量
2.构建函数
思路讲解
如何求number中出现的digit数字的数量?
我们先确定一位数字的大小:根据数学关系可得,取余运算中每次对10取余都可以得到个位数数字的大小,我们便能确定个位数字的大小。
10%10=1
120%10=0
111%10=1
个位数字的大小确定了,如何确定十位以及各个数字的大小?
c语言除法的特殊性:如果是两个整型数字相除,其结果还是整型
10/3=3
3/5=0
14/5=2
以此我们便可以将number每次结束时除以10,将它的十位数变为个位数,以此来记录十位数的大小,并且我们在除完最大的一位数后,它的最终结果为0,此时我们得到了停止循环的条件。
通过循环,我们便可以记录每一位数的大小,用i记录。
得出函数
int CountDigit( int number, int digit )
{
int i=0;
for(int m=0;number!=0;number=number/10)
{
m=number%10;
if(m==digit)
{
i++;
}
}
return i;
}
答案错误
很显然我们读题并没有读仔细,
-21252 2
digit记录的是正整数值,但如果number是负数呢?
再次审题得,同样记录。
同理 ,如果number本身就等于0呢?
理清思路
如果 number!=0,那么我们可以通过刚才的思路继续运算;如果number<0,那么我们可以通过数学关系可知,不管我们打了几个0,但它的数学含义只是0。因此,如果number=0,且digit=0,则只返回1即可。
同时,如果number是负数的话我们可以用绝对值函数abs()或者是fabs()来解决,需要注意的是fabs需要引入库函数<math.h>,abs()函数则在<std
lib.h>文件夹中,题目中没给,所以我们不需要。
那我们该用什么? ||操作符 ,满足m<0或m>0都可以。
或者是,直接将负number转化为正数
最终结果
int CountDigit( int number, int digit )
{
int i=0;
int m=0;
if(number!=0)
{
if(number<0)
{
number=-number;
}
for(m=0;number!=0;number=number/10)
{
m=number%10;
if(m==digit)
{
i++;
}
}
}
else if(number==0&&digit==0)
{
i=1;
}
return i;
}