第几天
题目描述
这是一个很经典的题,给定一个日期,输出这个日期是该年的第几天。
输入
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成(见样例) ,另外,可以向你确保所有的输入数据是合法的。
输出
对于每组输入数据,输出一行,表示该日期是该年的第几天。
样例输入
1985/1/20
2006/3/12
样例输出
20
71
方法一:暴力求和
-
所用知识点: 所用知识点: 所用知识点:
闰年的判断 split()方法的使用 String类型转int类型 switch case流程控制 闰年的判断: 闰年的判断: 闰年的判断:
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰 年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是 闰年)。
s p l i t ( ) 方法的使用: split()方法的使用: split()方法的使用:括号中可以接一个参数,也可以接两个参数- 接一个参数:
split(String regex)
将字符串按照regex分割成若干个字串(相当于是将字符串中含有 regex的全部挖掉),regex可以是正则表达式,也可以是字符、字符串 - 接两个参数:
split(String regex,int limit)
将字符串按照regex分割成limit份(相当于是按照字符串索引号从小到大的顺序依次挖掉 limit-1 个regex)
S t r i n g 类型转 i n t 类型 : String类型转int类型: String类型转int类型:参考文章👉基本数据类型与引用数据类型String之间的转换及基本数据之间的转换
s w i t c h ( ) c a s e : switch()~~case: switch() case:作用是找到相应的case,如果后面没加break就会进入下一个case。
注意事项:switch括号中控制的表达式类型只能是byte、char、short、int、String类型或enum(枚举型)类型(总结来讲:就是基本数据类型中不支持浮点型和boolean型,引用数据类型只支持String型和enum型) - 接一个参数:
-
解题分析: 解题分析: 解题分析:
首先我们需要判断输入的年份是否是闰年,这才是题目的核心所在。闰年比平年在2月份要多一天,明确了这一个点这个题目就很简单了。import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String sts = null; String[] time = null; int sum; while(sc.hasNext()) { sum = 0; sts = sc.next(); time = sts.split("\\/"); switch(Integer.parseInt(time[1])) { case 1:sum=0;break; case 2:sum=31;break; case 3:sum=59;break; case 4:sum=90;break; case 5:sum=120;break; case 6:sum=151;break; case 7:sum=181;break; case 8:sum=212;break; case 9:sum=243;break; case 10:sum=273;break; case 11:sum=304;break; case 12:sum=334;break; } sum += Integer.parseInt(time[2]); if(Integer.parseInt(time[1])>2 && check(time[0])) { sum++; } System.out.println(sum); } sc.close(); } //判断闰年 public static boolean check(String n) { int year = Integer.parseInt(n); if((year%100!=0 && year%4==0)||(year%400==0)) { return true; }else { return false; } } }
如果你懒得计算sum还可以这样写
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String sts = null; String[] time = null; int[] day = {31,28,31,30,31,30,31,31,30,31,30};//将11个月份的天数用一个数组存起来 int sum; while(sc.hasNext()) { sum = 0; sts = sc.next(); time = sts.split("\\/"); switch(Integer.parseInt(time[1])) { case 12:sum+=day[10]; case 11:sum+=day[9]; case 10:sum+=day[8]; case 9:sum+=day[7]; case 8:sum+=day[6]; case 7:sum+=day[5]; case 6:sum+=day[4]; case 5:sum+=day[3]; case 4:sum+=day[2]; case 3:sum+=day[1]; case 2:sum+=day[0]; case 1:sum+=0;break;//break写不写都无所谓 } sum += Integer.parseInt(time[2]); if(Integer.parseInt(time[1])>2 && check(time[0])) { sum++; } System.out.println(sum); } sc.close(); } //判断闰年 public static boolean check(String n) { int year = Integer.parseInt(n); if((year%100!=0 && year%4==0)||(year%400==0)) { return true; }else { return false; } } }
使用方法一解题期间遇到的问题:
在使用sc.hasNext()接收多行输入时,无法结束循环。在这篇文章找到了解答,附原文链接:Java while(sc.hasNext())无法跳出循环的问题
方法二:巧用Calendar类
-
所用知识点: 所用知识点: 所用知识点:
利用SimpleDateFormat类中的parse()方法将字符串转成Date对象 利用Calendar直接输出当前年份天数 相关知识点可以查看文章:JavaSE基础回顾7.7和7.8小节的内容
package com.hhxy.practice;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws ParseException {
Scanner sc=new Scanner(System.in);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");//提供字符串格式
while(sc.hasNext()){
Date d = sdf.parse(sc.next());//将相应字符串格式转成相应的Date对象
Calendar c = Calendar.getInstance();//创建Calendar对象
c.setTime(d);//将日历设置成当前年份的日历
System.out.println(c.get(Calendar.DAY_OF_YEAR));//直接输出当前日期所在日历的第几天
}
}
}