获得某年某月有多少天!

举报
念君思宁 发表于 2023/02/16 18:12:11 2023/02/16
【摘要】 获得某年某月有多少天!
31 篇文章 3 订阅

牛客网练习题,获得某年某月有多少天!

对于牛客网而言,不少人即使爱又是充满了恨,毕竟刷着牛客网的习题,一方面知识长多了不少,但是对于牛客网的习题难度却是充满了怀疑,笔者目前小白一枚,仅通过牛客网进行C语言的初步练习,但是简单题目却是少之又少!基本算下来,每一道靠自己琢磨下来的习题,都得将近1个多小时,而且这还仅仅是容易简单的练习题,现在笔者在怀疑,将来对于难度稍微大点的练习题该如何去处理!

话不多说,下面来进入对牛客网的习题进行解答!获得某年某月有多少天!

描述

KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。

输入描述:

多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。

输出描述:

针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。

示例1

输入     2008 2

输出     29

对于这道题,我们需要知道,每一年的每一月有多少天(注意闰年的2月特殊情况)

一个月有31的天的月份有:1月,3月,5月,7月,8月,10月,12月;

一个月有30的天的月份有:4月,6月,9月,11月;

较为特殊的月份为:  2月(28或者29天);

因此对比上述情况,我们可以用switch{  case:  break;  }结构来进行书写代码

但是需要注意牛客网要求多组输入,因此又用到while()来实现多组输入!

下面请看笔者的代码:

#include <stdio.h>
int main()
{
	int year = 0;
	int month = 0;
	while (scanf("%d %d", &year, &month)==2)
	{
		switch (month)
		{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			printf("%d\n", 31);  //月份为31的天数
			break;   //跳出循环
		case 4:
		case 6:
		case 9:
		case 11:
			printf("%d\n", 30);    //月份为30的天数
			break;
		case 2:
		{
			if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
				printf("%d\n", 29);
			else
				printf("%d\n", 28);
		}
 
		}
	}
	return 0;
}

上述代码将月份按照三种情况来进行分析!

代码的运转结果为:

 实现了牛客网的要求,因此笔者也如愿以偿的得到了牛客网的.................恭喜你通过本题!

 

虽然逻辑上显得清晰易懂,但是代码不够简洁!

最近刚刚学习了函数,对于函数的简单代码,逻辑清晰,目的明确,兴趣大增,因此我们可以用函数的方法来进行些许简化!

#include <stdio.h>
int is_leap_year(int year)
{
	return  (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));
	//判断是否为闰年,是闰年就返回值为非0值(1)
}
int main()
{
	int year = 0;
	int month = 0;
	int days[13] = { 0,31,28,31,20,31,30,31,31,30,31,30,31 };
	//将12个月的天数全部列在一个数组里面,输入month的值,则就输出数组中对应的该值
	//将数组定义为13的原因为:数组首元素的下标为:days[0]但是月份最小为1月
 
	while (scanf("%d %d", &year, &month) == 2)
	{       //涉及scanf()的返回值问题
		int day = days[month];
		if (is_leap_year(year) && month == 2)
		{
			day++;       //闰年2月比普通2月多一天则进行++
		}
		printf("%d\n", day);
	}
	return 0;
}

在该代码段中,最重要的主要有一下两点:请大家多多注意!

1.        int days[13] = { 0,31,28,31,20,31,30,31,31,30,31,30,31 };
    //将12个月的天数全部列在一个数组里面,输入month的值,则就输出数组中对应的该值
    //将数组定义为13的原因为:数组首元素的下标为:days[0]但是月份最小为1月

2.       while (scanf("%d %d", &year, &month) == 2)
      //涉及scanf()的返回值问题;    scanf()输入%d  %d一共有两个数字,返回值为2,即判断2==2是否成立,如果成立则进入while循环,否则,则不进入循环!

到此为止,该文章通过牛客网练习题已经将笔者想要表达的内容如实表现出来,但是对于一些没有涉及到的不足之处,请大家多多斧正

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。