话不多说直接上例题
例题:
一、从1937年01月01日(周五)到2021年3月20日共有多少个星期一?
public class Main {
static int[] arr = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static int year = 1937, month = 1, day = 1, data = 5;
public static void main(String[] args) {
int ans = 0;
while (year != 2021 || month != 3 || day != 20) {
if (year % 4 == 0 || (year % 4 == 0 && year % 100 != 0)) {
arr[2] = 29;
} else {
arr[2] = 28;
}
if (check()) {
ans++;
}
day++;
data++;
if (data > 7) {
data = data % 7;
}
if (day > arr[month]) {
month++;
day = 1;
}
if (month > 12) {
month = 1;
year++;
}
}
System.out.println(ans);
}
static boolean check() {
int a = year, b = month, c = day, d = data;
if (data % 7 == 1) {
return true;
}
return false;
}
}
答案输出:4394
二、1949 年的国庆节( 10 月 1 日)是星期六。今年(2012)的国庆节是星期一。那么,从建国到现在,有几次国庆节正好是星期日呢?不要求写出具体是哪些年,只要一个数目!
public class Main {
//静态变量(全局变量)
static int[] arr = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static int year = 1949, month = 10, day = 1, data = 6;
//data=0表示周天,data=1表示周一,data=6表示周六。
public static void main(String[] args) {
int ans = 0;
while (year != 2012 || month != 10 || day != 1) {
//判断是否是闰年
if (year % 4 == 0 || (year % 4 == 0 && year % 100 != 0)) {
arr[2] = 29;
} else {
arr[2] = 28;
}
if (check()) {
ans++;
}
day++;
data++;
data = data % 7;
if (data > 7) {
data = data % 7;
}
if (day > arr[month]) {
month++;
day = 1;
}
if (month > 12) {
month = 1;
year++;
}
}
System.out.println(ans);
}
//check()函数用来判断是否符合题意
static boolean check() {
int a = year, b = month, c = day, d = data;
return b==10&&c==1&&d==0;
}
}
三、
小蓝特别喜欢 2,今年是公元 2020年,他特别高兴,因为每天日历上都可以看到 2。如果日历中只显示年月日,请问从公元 1900 年 1 月 1 日元 9999年 12 月 31 日,一共有多少天日历上包含 2。即有多少天中年月日的数位中包含数字 2。
public class Main {
static int[] arr = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static int year = 1900, month = 1, day = 1;
public static void main(String[] args) {
int ans = 0;
while (year != 9999 || month != 12 || day != 31) {
//是否是闰年
if (year % 400== 0 || (year % 4 == 0 && year % 100 != 0)) {
arr[2] = 29;
} else {
arr[2] = 28;
}
//判断是否合法(判断是否符合题目要求)
//先判断再++,到最后一天已经结束循环
if (check()){
ans++;
}
day++;
if (day > arr[month]) {
month++;
day = 1;
}
if (month > 12) {
month = 1;
year++;
}
}
System.out.println(ans + 1);
}
static boolean check() {
//不能直接操作year,month,day,因为是全局变量.
//判断年份有没有2
int a = year;
while (a > 0) {
if (a % 10 == 2) {
return true;
}
}
//判断月有没有2
int b = month;
while (b > 0) {
if (b % 10 == 2) {
return true;
}
}
//判断日有没有2
int c = day;
while (c > 0) {
if (c % 10 == 2) {
return true;
}
}
return false;
}
}
总结
总的来说日期类问题除使用Calender类和Data类外,以上题型均可用日期类模板,如下:
public class Main {
//静态变量(全局变量)
static int[] arr = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static int year = 开始年份, month = 开始月份, day = 开始日期;
public static void main(String[] args) {
int ans = 0;
while (year != 截止年份 || month != 截止月份 || day != 截止日期) {
//判断是否是闰年
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
arr[2] = 29;
} else {
arr[2] = 28;
}
//check()函数用来判断是否符合题意(是否合法)
if (check()) {
ans++;//计数器
}
day++;
//如果日期大于每个月的天数则月份更新,month++,日期day更新为1。
if (day > arr[month]) {
month++;
day = 1;
}
//如果月份超过12月,月份更新为1月,年数+1.
if (month > 12) {
month = 1;
year++;
}
}
System.out.println(ans);
}
//check()函数用来判断是否符合题意
static boolean check() {
//不能直接操作year,month,day,因为是全局变量.
int a = year, b = month, c = day;
//下面写代码进行判断是否合法
return false;
}
}
固定模板套用即可。