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

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

对于牛客网而言,不少人即使爱又是充满了恨,毕竟刷着牛客网的习题,一方面知识长多了不少,但是对于牛客网的习题难度却是充满了怀疑,笔者目前小白一枚,仅通过牛客网进行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;
}


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


代码的运转结果为:


0a2653c851af460fa595bd959398a8f1.png


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


6de278e6d6694ce5bb08e7e842b7e74b.png


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


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

#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循环,否则,则不进入循环!


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


相关文章
|
5月前
|
C语言
C语言——oj刷题——获取月份天数
C语言——oj刷题——获取月份天数
62 0
|
算法 Java 索引
《剑指offer》题解——week1
思路:定义一个哈希表,遍历一次数组,利用哈希表对每个元素进行标记。若当前元素被标记过了,则该元素重复。 **时间复杂度:**`O(n)` **方法二:原地交换** 主要思想是把每个数放到对应的位置上,即让 `nums[i] = i`。 前往后遍历数组中的所有数,假设当前遍历到的数是 `nums[i]=x`,那么: - 如果`x != i && nums[x] == x`,则说明 `x`出现了多次,直接返回 `x`即可; - 如果`nums[x] != x`,那我们就把 `x` 交换
92 0
《剑指offer》题解——week1
|
机器学习/深度学习 存储 算法
《剑指offer》题解——week4
《剑指offer》题解——week4
117 0
《剑指offer》题解——week4
|
机器学习/深度学习 存储 算法
《剑指offer》题解——week2
由于需要对结果进行取余,导致`不能使用动态规划`,因为取模导致了dp的运算出现了问题。dp是通过最优子问题来计算出最终结果的,而取模之后就导致计算最优子问题出现了问题,计算出来的`dp[i-j]*j`表面上可能是最大的,但是`dp[i-j]`也是经过取模运算的,从而这会导致`dp[i]`不是由前面的最优子问题推出来的。
74 0
《剑指offer》题解——week2
|
存储 机器学习/深度学习 算法
《剑指offer》题解——week7
《剑指offer》题解——week7
62 0
《剑指offer》题解——week7
|
算法 搜索推荐 Java
《剑指offer》题解——week5
《剑指offer》题解——week5
58 0
《剑指offer》题解——week5
|
算法 C++
蓝桥杯练习题七 - 第几天(c++)
蓝桥杯练习题七 - 第几天(c++)
126 0
蓝桥杯练习题七 - 第几天(c++)
练习题之牛客网
练习题之牛客网
113 0
原来牛客网练习题还能这么做?
原来牛客网练习题还能这么做?
109 0
|
机器学习/深度学习
牛客网练习题(函数部分)
牛客网练习题(函数部分)
94 0