這是一個很常見的問題,因同學問我該怎樣實現。今天閒來無事,就實現了一下。算法很簡單,很適合作爲C/C++的基礎訓練題。
//判斷是不是閏年
bool IsLeapYear(int nYear)
{
if(nYear <= 0)
exit(0);
if((nYear%4 == 0 && nYear%100 != 0) || (nYear%400 == 0))
return true;
else
return false;
}
//檢查輸入的日期是否合法
bool CheckDate(int nYear,int nMonth,int nDay)
{
if(nYear <0 || nMonth<0 || nDay<0)
exit(0);
int nLeapYearMonth[] = {31,29,31,30,31,30,31,31,30,31,30,31}; //閏年對應月份的天數
int nNoLeapYearMonth[] = {31,28,31,30,31,30,31,31,30,31,30,31}; //非閏年對應月份的天數
if(IsLeapYear(nYear))
{
if(nDay <= nLeapYearMonth[nMonth-1])
return true;
else
return false;
}
else
{
if(nDay <= nNoLeapYearMonth[nMonth-1])
return true;
else
return false;
}
return false;
}
int DayOfYear(string &strDate)
{
if(strDate.c_str() == NULL)
exit(0);
int nLeapYearMonth[] = {31,29,31,30,31,30,31,31,30,31,30,31}; //閏年對應月份的天數
int nNoLeapYearMonth[] = {31,28,31,30,31,30,31,31,30,31,30,31}; //非閏年對應月份的天數
//把傳入固定格式的日期分解
string strTemp = strDate;
int nStart,nPos;
string strYear,strMonth,strDay;
nStart = 0;
nPos = strTemp.find('-',nStart);
strYear.assign(strTemp,nStart,nPos);
nStart = nPos+1;
nPos = strTemp.find('-',nStart);
strMonth.assign(strTemp,nStart,2);
nStart = nPos+1;
strDay.assign(strTemp,nStart,2);
int nYear = atoi(strYear.c_str());
int nMonth = atoi(strMonth.c_str());
int nDay = atoi(strDay.c_str());
if(!CheckDate(nYear,nMonth,nDay))
exit(0);
//計算這是今年的第幾天
int nDayOfYear = 0;
int nIndex = 0;
if(IsLeapYear(nYear))
{
nIndex = nMonth-2;
while(nIndex >= 0)
{
nDayOfYear += nLeapYearMonth[nIndex];
nIndex--;
}
nDayOfYear += nDay;
}
else
{
nIndex = nMonth-2;
while(nIndex-- >= 0)
{
nDayOfYear += nNoLeapYearMonth[nIndex];
nIndex--;
}
nDayOfYear += nDay;
}
return nDayOfYear;
}
關於計算這一天是星期幾,我的想法是從世界上的第一個星期一算起到今天有多少天,然後模7求餘數。餘數是幾就是星期幾。