计算一个数字在一个特定年份某个月中出现的次数(c语言进阶版)

日历中的数字

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

ElemenT马上就要毕业了,他打开日历看了看时间。发现日历上的日期都是2017-04-04这样的格式的,月和日如果不足2位数,前面都会补充0。

给定一个年份和月份,ElemenT把那个月的日期都按上述格式写到纸上,他现在想知道某种数字出现了多少次。

输入描述:

多组输入
每组输入一行,有3个数字y,m,x(1000<=y<=3000,1<=m<=12,0<=x<=9),分别代表年份,月份,和他想知道哪个数字出现的次数。

输出描述:

每组输出一个整数,表示数字x在这个月的日期里出现了多少次。

这是一个优秀的例子,认真思考,有助于我们初学者理解 函数 与 字符串 的有关知识

1.主函数 

int main()
{
	int y,m,x;
	//y为年,m为月,x为所求数字 
	while(scanf("%d%d%d",&y,&m,&x) == 3)
	{	//监测输入是否合法 
		
		int result = leap(y,m,x);
		printf("%d\n",result);
	}
	
	return 0;
} 

 

2.leap函数,注释都在代码里

int leap(int y, int m, int x)
{
	//计算该月有几天 
	int days;
	if(m == 2)
	{
		if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
		{
			days = 29;
		}else{
		days = 28;
		}
	}else if(m == 4 ||m == 6 ||m == 9||m == 11)
	{
		days = 30;
	}else{
		days = 31;
	}
	
	//统计数字出现次数
	int count = 0;
	char date_str[11];
	for(int day = 1;day <= days;day++)
	{
		sprintf(date_str,"%04d-%02d-%02d",y,m,day);
		//将这一日期的年,月,日储存在字符数组中以便遍历
		 
		for(int i = 0;i < strlen(date_str);i++)
		{
			if(date_str[i] == x + '0')
			//x + '0'是为了将int转化为char 
			count++;
		}
	} 
	
	return count;
}

3.完整代码

#include <stdio.h>
#include <string.h>

int leap(int y, int m, int x)
{
	//计算该月有几天 
	int days;
	if(m == 2)
	{
		if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
		{
			days = 29;
		}else{
		days = 28;
		}
	}else if(m == 4 ||m == 6 ||m == 9||m == 11)
	{
		days = 30;
	}else{
		days = 31;
	}
	
	//统计数字出现次数
	int count = 0;
	char date_str[11];
	for(int day = 1;day <= days;day++)
	{
		sprintf(date_str,"%04d-%02d-%02d",y,m,day);
		//将这一日期的年,月,日储存在字符数组中以便遍历
		 
		for(int i = 0;i < strlen(date_str);i++)
		{
			if(date_str[i] == x + '0')
			//x + '0'是为了将int转化为char 
			count++;
		}
	} 
	
	return count;
}

int main()
{
	int y,m,x;
	//y为年,m为月,x为所求数字 
	while(scanf("%d%d%d",&y,&m,&x) == 3)
	{	//监测输入是否合法 
		
		int result = leap(y,m,x);
		printf("%d\n",result);
	}
	
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值