catalogue

# subject

# Train of thought analysis

According to the idea of this question, we might as well make a calendar for 2007

Then, according to the requirements of the topic, discharge the floor sweepers

Mon | Tue | Wed | Thu | Fri | Sat | Sun | |

September | 1(B) | 2(X) | |||||

3(ALL) | 4(H) | 5(P) | 6(B) | 7(X) | 8(H) | 9(P) | |

10(ALL) | 11(B) | 12(X) | 13(H) | 14(P) | 15(B) | 16(X) | |

17(ALL) | 18(H) | 19(P) | 20(B) | 21(X) | 22(H) | 23(P) | |

24(ALL) | 25(B) | 26(X) | 27(H) | 28(P) | 29(B) | 30(X) | |

October | 1(ALL) | 2(H) | 3(P) | 4(B) | 5(X) | 6(H) | 7(P) |

8(ALL) | 9(B) | 10(X) | 11(H) | 12(P) | 13 | 14 | |

15(ALL) | 16 | 17 | 18 | 19 | 20 | 21 | |

22 | 23 | 24 | 25 | 26 | 27 | 28 | |

29 | 30 | 31 | |||||

November | 1 | 2 | 3 | 4 |

According to the table, I must have found out the law, that is, a cycle of 14 days. Therefore, happily start playing table life

//c + + code string name[14]={"B","X","ALL","H","P","B","X","H","P","ALL","B","X","H","P"};//Typed by //c language code char name[][14]={"B","X","ALL","H","P","B","X","H","P","ALL","B","X","H","P"};//Typed by

Since it is a cycle of 14 days, we can calculate the total number of days, and then mod14.

However, the dates of each month are different, so they start a happy watch life again

int Month[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,0};//Enter the month by typing the table

Suppose the target date is October 20, 2007, which is 49 days by oral calculation, and then we can easily come up with a violent solution.

int year=2007,month=10,day=20; int sum=0; for(int i=9;i<=month;i++){ sum+=Month[i]; } sum+=365*(year-2007); sum+=day-1;

But what about 2008? What about 2009? (because the initial value of i is 9, if it's for April, this code won't work.) then go to if again else special judgment, this seems a little complicated.

Therefore, we might as well do a process to calculate the number of days from the first day of each month to the end of the year.

int Month[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,0}; int sum=0,month=10,day=20; //The suffix is summed so that Month[i] represents the number of days to the end of the year for(int i=12;i>=1;i--){ Month[i]+=Month[i+1]; } //The difference from the number of days on September 1 can be expressed in this way sum=Month[9]-Month[month]+day-1;

You must be a little confused when you see here.

Due to the suffix and processing, in fact, the current Month[9]==30+31+30+31=122, that is, the number of days from September 1 to December 31 at the end of the year. Since the assumed month=10, Month[10]=31+30+31=92, that is, the number of days from October 1 to the end of the year. The subtraction of the two formulas is exactly 30 days, that is, the number of days in September. Then we add the number of days of day - 1 (minus September 1) to make the total number of days 49.

Then you must think I'm so superfluous. Let's take another example, February 10, 2008.

Or did you know by oral arithmetic that it was 162 days

int Month[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,0}; int sum=0,year=2008,month=2,day=10; //The suffix is summed so that Month[i] represents the number of days to the end of the year for(int i=12;i>=1;i--){ Month[i]+=Month[i+1]; } //The difference from the number of days on September 1 can be expressed in this way sum=Month[9]-Month[month]+day-1; sum+=365*(year-2007);

Due to the suffix and processing, the current Month[2] is 334, that is, the number of days from February 1 to December 31.

Bring in the formula to calculate sum=365+122-334+10-1=162. The calculated results are in perfect agreement with the speculation.

To sum up, the summation code is:

sum=365*(year-2007)-Month[month]+Month[9]+day-1;

But don't think it's over. There's still a hole in the problem, that is, 2008 is a leap year!!! There are 29 days in February.

Through the previous summation, it is known that the period from September 1, 2007 to February 28, 2008 is exactly 180 days.

Therefore, when sum > 180, let sum + +. Careful students have found that there will be no 181?

Yes, 181 is February 29, so let's list it separately.

if(sum>180) sum++; if(year==2008&&month==2&&day==29) sum=181;

Well, it took so long to sum up, and then it's output.

Because of the previous rule, we know that there is a cycle in 14 days, so we only need sum%14, that is, output name[sum%14].

Finally, combine the above bulk codes.

# code implementation

c language

#include<bits/stdc++.h> int Month[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,0};//Enter the month by typing the table char name[][14]={"B","X","ALL","H","P","B","X","H","P","ALL","B","X","H","P"};//Typed by int main() { //Enter month, year and day int year,month,day,sum; scanf("%d %d %d",&year,&month,&day); //Suffix and for(int i=12;i>=1;i--){ Month[i]+=Month[i+1]; } //Calculate total days sum=365*(year-2007)-Month[month]+Month[9]+day-1; if(sum>180) sum++; if(year==2008&&month==2&&day==29) sum=181; //output printf("%s\n",name[sum%14]); return 0; }

C++

#include<bits/stdc++.h> using namespace std; int Month[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,0};//Enter the month by typing the table string name[14]={"B","X","ALL","H","P","B","X","H","P","ALL","B","X","H","P"};//Typed by int main() { //Enter month, year and day int year,month,day,sum; cin>>year>>month>>day; //Suffix and for(int i=12;i>=1;i--){ Month[i]+=Month[i+1]; } //Calculate total days sum=365*(year-2007)-Month[month]+Month[9]+day-1; if(sum>180) sum++; if(year==2008&&month==2&&day==29) sum=181; //output cout<<name[sum%14]<<endl; return 0; }