2020年藍橋杯省賽試題——跑步鍛煉(填空題)


題目描述:

小藍每天都鍛煉身體。

正常情況下,小藍每天跑 1 千米。如果某天是周一或者月初(1 日),為了激勵自己,小藍要跑 2 千米。如果同時是周一或月初,小藍也是跑 2 千米。

小藍跑步已經堅持了很長時間,從 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。請問這段時間小藍總共跑步多少千米?

這道題個人感覺沒別的,就只能死算,希望能有大佬指點迷津,看看這道題有沒有什么技巧能快速出答案

 

學習體驗

這道題讓我再次回顧了一下Java中處理日期時間的API,果然真的好久沒用都生疏了,寫這題竟然都用了半個多小時,看來以后得多敲代碼了,畢竟熟能生巧嘛。這題當中我用到了Calendar類中的一些方法,比如獲取今天是星期幾(get(int field)),還有after(Date date) ,after方法可以用來推到出兩個日期相隔多少天

 

1、注意月份,一月是0,二月是1,。。。以此類推
2、星期天是1,星期一是2,星期二是3,。。。以此類推

 

Java代碼:

 1 import java.text.ParseException;
 2 import java.text.SimpleDateFormat;
 3 import java.util.Calendar;
 4 import java.util.Date;
 5 
 6 public class Main3 {
 7     public static void main(String[] args) throws ParseException {
 8     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 9     // 一共多少天
10     Date start = sdf.parse("2000-01-01");
11     Date end = sdf.parse("2020-10-01");
12     
13     Date temp = new Date(start.getTime());
14     // 當前也算一天
15     int day = 1;
16     
17     // after()方法,判斷當前日期是否在指定日期的后面,如果是則返回true,反之,則返回false
18     while (end.after(temp)) {
19         temp = new Date(temp.getTime() + 24 * 60 * 60 * 1000);
20         day++;
21     }
22     System.out.println("一共要跑" + day + "天");
23     
24     
25     // 中間一共有幾個周一,當前是周六
26     int monday = (day - 5) / 7 + ((day - 5) % 7 == 0 ? 0 : 1);
27     System.out.println("周一有" + monday + "天");
28     // 有幾個月初
29     int monthStart = 20 * 12 + 10;
30     System.out.println("月初有" + monthStart + "天");
31     // 有幾個周一與月初在同一天
32     int sameDay = 0;
33     
34     Calendar c = Calendar.getInstance();
35     int year = 2000;
36     // 這里要注意月份月是0,二月是1,。。。以此類推
37     // 星期天是1,星期一是2,星期二是3,。。。以此類推
38     c.set(year, 0, 1);
39     while (c.get(Calendar.YEAR) != 2020 || c.get(Calendar.MONDAY) != 10 || c.get(Calendar.DATE) != 1) {
40         // 判斷
41         int weekday = c.get(Calendar.DAY_OF_WEEK) - 1;
42         if (weekday == 1) {
43         sameDay++;
44         }
45         // 每次往后推一個月
46         if (c.get(Calendar.MONTH) < 12) {
47         c.set(Calendar.MONTH, c.get(Calendar.MONTH) + 1);
48         } else {
49         year++;
50         c.set(Calendar.YEAR, year);
51         c.set(Calendar.MONTH, 1);
52         }
53     }
54     System.out.println("同時是周一或月初:" + sameDay);
55     
56     int twoKilo = monthStart +  monday - sameDay;
57     int oneKilo = day - twoKilo;
58     
59     int totalKilo = oneKilo + twoKilo * 2;
60     System.out.println("一共要跑:" + totalKilo + "千米");
61     }
62 }

 運行結果:

 大佬的思路:太奇妙了

 1 import java.util.*;
 2 import java.text.*;
 3 
 4 public class Main {
 5     public static void main(String[] args) throws Exception{
 6         long oneDay = 1000 * 60 * 60 * 24;
 7 
 8         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 9 
10         long start = sdf.parse("2000-01-01 00:00:00").getTime();;
11         long end = sdf.parse("2020-10-01 00:00:00").getTime();
12 
13         int ans = 0;
14         while (start <= end) {
15           if (new Date(start).toString().contains("Mon") || new Date(start).toString().contains(" 01 ")) {
16             ans += 2;
17           } else {
18             ans++;
19           }
20           // 加一天
21           start = new Date(start).getTime() + oneDay;
22         }
23 
24         System.out.println(ans);
25     }
26 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM