sicily 7601. calendar & 7602. calendar with class
7601. calendar
Description
小py是一个熊孩子,他 很想知道某一个日期是星期几,于是他找到了你。请你写一个程序,对于输入的某一个日期,输出1-7中某个数值,表示星期一到星期天中某一天(其中1为星期 一)。由于py是个熊孩子,他可能会说出一个不合法的日期,所以你还需要进行日期合法性判断,非法日期输出-1。
Input
输入包含多组数据。每行包括三个整数y(2000<=y<=9999), m, d。输入数据以0 0 0结束。
Output
每组数据输出一行,每行包括一个整数。1表示星期一,7表示星期日,等等,若数据非法,则输出-1。
0 0 0不需输出
7602. calendar with class
Description
小py又淘气了。他知道你今天开始学习C++了,所以想请你实现一个类Date。类Date的定义如下
class Date {
public:
Date(int year, int month, int day);
int GetWeekday() const;
private:
int year_;
int month_;
int day_;
};
现在你要实现GetWeekday函数,该函数能使用year_,month_,day_这几个成员变量,分别代表年月日。如果日期合法,返回值为1-7中某个数值,表示星期一到星期天中某一天(其中1为星期一),如果不合法,请返回-1。
Hint
class Date {
public:
Date(int year, int month, int day)
: year_(year),
month_(month),
day_(day) {}
int GetWeekday() const {
// TODO(student): Return 1 - 7 which represent the weekday of this date.
// If this is a invalid date, please return -1; For example, 2013/2/26
// will return 2.
// Hint: In this function, you can use the member variable year_ = 2013,
// month_ = 2, day_ = 26 for the above example.
}
private:
int year_;
int month_;
int day_;
};
提交上述你实现好的代码即可。
Juan说这个星期的实验课不上了……于是溜进法师的班蹭题做。
注意闰年判定、数列判定非法日期,这里用了基姆拉尔森公式计算星期几。带class的那个要注意把constructor也定义一下,不然会CE
TA改过用例之后WA了,仔细检查一下发现验证闰年日期是否合法的部分逻辑有点问题,出现了漏网之鱼,重新修正了才AC,为了方便判断开了闰年和非闰年两个数组
另外发现用蔡勒公式貌似不能AC?
7601
#include<iostream> using namespace std; int nmonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int lmonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; bool is_leap( int y ) { if ( y % 4 == 0 && y % 100 != 0 ) return true; else if ( y % 400 == 0 ) return true; else return false; } int main() { int w, y, m, d, c; cin >> y >> m >> d; while( y != 0 ) { if ( m < 1 || m > 12 ) cout << -1 << endl; else if ( is_leap(y) && ( d > lmonth[m-1] || d < 1 ) ) cout << -1 << endl; else if ( !is_leap(y) && ( d > nmonth[m-1] || d < 1 ) ) cout << -1 << endl; else { if( m == 1 || m == 2 ) { m = m + 12; y = y - 1; } w = ( y + y/4 + c/4 - 2*c + 26*(m+1)/10 + d ) % 7 + 1; cout << w << endl; } cin >> y >> m >> d; } return 0; }
7602
class Date { public: Date(int year, int month, int day); int GetWeekday(); private: int year_; int month_; int day_; }; int Date::GetWeekday() { int week; int nmonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int lmonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; bool leap; if ( year_ % 4 == 0 && year_ % 100 != 0 ) leap = true; else if ( year_ % 400 == 0 ) leap = true; else leap = false; if ( month_ < 1 || month_ > 12 ) return -1; else if ( leap && ( day_ > lmonth[month_-1] || day_ < 1 ) ) return -1; else if ( !leap && ( day_ > nmonth[month_-1] || day_ < 1 ) ) return -1; if( month_ == 1 || month_ == 2 ) { month_ = month_ + 12; year_ = year_ - 1; } week = ( day_ + 2*month_ + 3*(month_+1)/5 + year_ + year_/4 - year_/100 + year_/400 ) % 7 + 1; return week; } Date::Date( int year, int month, int day ) { year_ = year; month_ = month; day_ = day; }
追记:为了方便在计算过程中修改了month_和year_的值,如果要按照题目要求,用int GetWeekday() const;做prototype的话,就要避免这个修改才能通过编译。事实上,如果这个class还要用的话,避免修改这个值才是正确的做法
修改后代码如下
class Date { public: Date(int year, int month, int day); int GetWeekday() const; private: int year_; int month_; int day_; }; int Date::GetWeekday() const { int week; int nmonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int lmonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; bool leap; int m, y; if ( year_ % 4 == 0 && year_ % 100 != 0 ) leap = true; else if ( year_ % 400 == 0 ) leap = true; else leap = false; if ( month_ < 1 || month_ > 12 ) return -1; else if ( leap && ( day_ > lmonth[month_-1] || day_ < 1 ) ) return -1; else if ( !leap && ( day_ > nmonth[month_-1] || day_ < 1 ) ) return -1; m = month_; y = year_; if( month_ == 1 || month_ == 2 ) { m = month_ + 12; y = year_ - 1; } week = ( day_ + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400 ) % 7 + 1; return week; } Date::Date( int year, int month, int day ) { year_ = year; month_ = month; day_ = day; }