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;
}

 

 

posted @ 2013-07-14 11:35  开心成长  阅读(269)  评论(0编辑  收藏  举报