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

View Code
#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

View Code
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还要用的话,避免修改这个值才是正确的做法

修改后代码如下

View Code
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;
}
posted @ 2013-02-27 15:00  Joyee  阅读(444)  评论(0编辑  收藏  举报