記錄一下練習(xí)的代碼予颤。不想存電腦里了囤官,分享一下我寫的渣代碼。蛤虐。党饮。
重點(diǎn)是第幾個(gè)月的第幾個(gè)星期幾,不是第幾周的星期幾驳庭。刑顺。。饲常。哎蹲堂,要看清楚呀。贝淤。柒竞。。
代碼是稍微長了那么一點(diǎn)播聪,但是從最小的年份到最大的年份一次計(jì)算完成朽基,中間用counter
計(jì)數(shù)布隔。
如果每個(gè)年份是次數(shù)少,可以用函數(shù)封裝一下稼虎,求一個(gè)年份調(diào)用一次执泰。
如果需要求多個(gè)年份,還是用變量保存一下渡蜻,減少一些重復(fù)計(jì)算术吝。
試題編號: | 201503-3 |
---|---|
試題名稱: | 節(jié)日 |
時(shí)間限制: | 1.0s |
內(nèi)存限制: | 256.0MB |
問題描述
有一類節(jié)日的日期并不是固定的,而是以“a月的第b個(gè)星期c”的形式定下來的茸苇,比如說母親節(jié)就定為每年的五月的第二個(gè)星期日排苍。
現(xiàn)在,給你a学密,b淘衙,c和y1, y2(1850 ≤ y1, y2 ≤ 2050),希望你輸出從公元y1年到公元y2年間的每年的a月的第b個(gè)星期c的日期腻暮。
提示:關(guān)于閏年的規(guī)則:年份是400的整數(shù)倍時(shí)是閏年彤守,否則年份是4的倍數(shù)并且不是100的倍數(shù)時(shí)是閏年,其他年份都不是閏年哭靖。例如1900年就不是閏年具垫,而2000年是閏年。
為了方便你推算试幽,已知1850年1月1日是星期二筝蚕。
輸入格式
輸入包含恰好一行,有五個(gè)整數(shù)a, b, c, y1, y2铺坞。其中c=1, 2, ……, 6, 7分別表示星期一起宽、二、……济榨、六坯沪、日。
輸出格式
對于y1和y2之間的每一個(gè)年份擒滑,包括y1和y2腐晾,按照年份從小到大的順序輸出一行。
如果該年的a月第b個(gè)星期c確實(shí)存在橘忱,則以"yyyy/mm/dd"的格式輸出赴魁,即輸出四位數(shù)的年份,兩位數(shù)的月份钝诚,兩位數(shù)的日期颖御,中間用斜杠“/”分隔,位數(shù)不足時(shí)前補(bǔ)零。
如果該年的a月第b個(gè)星期c并不存在潘拱,則輸出"none"(不包含雙引號)疹鳄。
樣例輸入
5 2 7 2014 2015
樣例輸出
2014/05/11
2015/05/10
評測用例規(guī)模與約定
所有評測用例都滿足:1 ≤ a ≤ 12,1 ≤ b ≤ 5芦岂,1 ≤ c ≤ 7瘪弓,1850 ≤ y1, y2 ≤ 2050。
# include <iostream>
#include <iomanip>
using namespace std;
void findDay(int tempDay,int b,int c,int limit,int i,int j)
{
int day=1;
int week=1;
bool isOk=false;
while(day<=limit)
{
/*
每月第幾周的周幾
if(week==b&&(tempDay+1)%7==(c%7))//tempDay+1 下月第一個(gè)星期
{
cout<<i<<"/";
cout<<setfill('0')<<setw(2)<<j;
cout<<"/";
cout<<setfill('0')<<setw(2)<<day<<endl;
isOk=true;
break;
}
tempDay++;
day++;
if((tempDay)%7==0&&day>2)
{
week++;
}
*/
//題目要求的是每月第幾個(gè)周幾 不是第幾周G葑睢O偾印!川无!
if((tempDay+1)%7==(c%7))
{
week++;
}
if((week-1)==b&&(tempDay+1)%7==(c%7))//tempDay+1 下月第一個(gè)星期
{
cout<<i<<"/";
cout<<setfill('0')<<setw(2)<<j;
cout<<"/";
cout<<setfill('0')<<setw(2)<<day<<endl;
isOk=true;
break;
}
tempDay++;
day++;
}
if(!isOk)
{
cout<<"none"<<endl;
}
}
int main()
{
int a,b,c,y1,y2;
cin>>a>>b>>c>>y1>>y2;
int counter=0;
int startYear=1850;
int startWeek=2-1;//偏移量
int tempDay=0;
for(int i=startYear; i<y1; ++i)
{
//閏年
if(i%400==0||(i%4==0&&i%100!=0))
{
counter+=366;
}//平年
else
{
counter+=365;
}
}
//計(jì)算月日
for(int i=y1; i<=y2; ++i)
{
for(int j=1; j<=12; ++j)
{
switch(j)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(j==a)//如果是當(dāng)前月則計(jì)算星期呛占。
{
tempDay=((counter)%7+startWeek)%7;//一共有幾周+起始的星期幾 1234567->2345671
findDay(tempDay,b,c,31,i,j);
}
counter+=31;
break;
case 2:
//閏年
if(i%400==0||(i%4==0&&i%100!=0))
{
if(j==a)//如果是當(dāng)前月則計(jì)算星期。
{
tempDay=((counter)%7+startWeek)%7;
findDay(tempDay,b,c,29,i,j);
}
counter+=29;
}//平年
else
{
if(j==a)//如果是當(dāng)前月則計(jì)算星期懦趋。
{
tempDay=((counter)%7+startWeek)%7;
findDay(tempDay,b,c,28,i,j);
}
counter+=28;
}
break;
default:
if(j==a)//如果是當(dāng)前月則計(jì)算星期晾虑。
{
tempDay=((counter)%7+startWeek)%7;
findDay(tempDay,b,c,30,i,j);
}
counter+=30;
break;
}
}
}
return 0;
}