C++_USACO_年月份计算_Friday the Thirteenth
/* PROB:friday LANG:C++ */ #include<iostream> #include<fstream> using namespace std; const int MAXINPUT=400; const int MONTHS=12; int main(){ int myday[MAXINPUT*MONTHS]; myday[0]=6; int count[7]={0}; int year=1900; int month; int n; ifstream ifs("friday.in"); ofstream ofs("friday.out"); ifs>>n; for(int i=0;i<MONTHS*n-1;i++){ month=(i+1)%12+1; if(month==1) year++; if(month==2||month==4||month==6||month==8||month==9||month==11||month==1) myday[i+1]=(31%7+myday[i])%7; else if(month==5||month==7||month==10||month==12) myday[i+1]=(30%7+myday[i])%7; else if(month==3){ if((year%100==0 && year%400==0)||(year%100!=0 && year%4==0)) myday[i+1]=(29%7+myday[i])%7; else myday[i+1]=(28%7+myday[i])%7; } if(myday[i+1]==0) myday[i+1]=7; } for(int i=0;i<MONTHS*n;i++){ switch(myday[i]){ case 1: count[2]++; break; case 2: count[3]++; break; case 3: count[4]++; break; case 4: count[5]++; break; case 5: count[6]++; break; case 6: count[0]++; break; case 7: count[1]++; break; } } for(int i=0;i<6;i++) ofs<<count[i]<<" "; ofs<<count[6]; ofs<<endl; }
注意:之前写的
for(int i=0;i<7;i++)
ofs<<count[i]<<" ";
不可以。按照USACO测试标准,原因如下:1、多输出了一个空格;2、没有另起一行
学习一个别人的:定义了每个月份的天数,每一年、每12个月进行一次遍历。比较好的:
#include<fstream> using namespace std; int main() { int year,month,i,n,last=3; int dayOfMonth[12]={31,31,28,31,30,31,30,31,31,30,31,30}; int result[7]={0}; ifstream fin("friday.in"); ofstream fout("friday.out"); fin>>n; for(year=1900;year<1900+n;++year){ if(year%400==0||(year%100!=0&&year%4==0)) dayOfMonth[2]=29; for(month=0;month<12;++month){ last=(last+dayOfMonth[month])%7; result[last]++; } dayOfMonth[2]=28; } for(i=0;i<6;++i) fout<<result[(i+6)%7]<<' '; fout<<result[5]<<endl; fin.close(); fout.close(); return 0; }