USACO_1_1_Friday the Thirteenth

本文介绍了一个C++程序,该程序用于统计指定年份范围内每个月13号是星期几的频率。通过定义一个时间类来计算给定日期是星期几,并统计了从1900年开始到指定结束年份中每个月13号落在星期几的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ExpandedBlockStart.gifContractedBlock.gif/**//*
ID: sdjllyh1
PROG: friday
LANG: C++
TIME: 2008/9/8
*/


//#include "stdafx.h"
#include <iostream>
#include 
<fstream>
#include 
<string>
using namespace std;

//时间类
class DATETIME
ExpandedBlockStart.gifContractedBlock.gif
{
private:
    
int m_year;
    
int m_month;
    
int m_day;
    
int m_week;//0 is Sunday,5 is friday
public:
    
//判断给定的年份是否是闰年
    static bool IsLeapYear(int year)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
bool retIs;

        
if(year % 100 ==0 )
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if(year % 400 == 0)
                retIs 
= true;
            
else 
                retIs 
= false;
        }

        
else
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if(year % 4 ==0)
                retIs 
= true;
            
else
                retIs 
= false;
        }

        
return retIs;
    }
    
public:
    
//构造时间对象
    DATETIME(int year, int month, int day)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        m_year 
= year;
        m_month 
= month;
        m_day 
= day;
        m_week 
= ComputeWeek();
    }

    
//获得星期
    int GetWeek()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
return m_week;
    }

private:
    
//计算星期
    int ComputeWeek()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
return GetDaysFrom1900() % 7;
    }

    
//计算当前时间于1900/1/1的天数差,如果当前为1900/1/1,则返回1
    int GetDaysFrom1900()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
int retDays = 0;
        
for(int i=1900; i<m_year; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if(!IsLeapYear(i))
                retDays 
+= 365;
            
else
                retDays 
+= 366;
        }

        
for(int i=1; i<m_month; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
switch(i)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
                    retDays 
+= 31;
                    
break;
                
case 4:case 6:case 9:case 11:
                    retDays 
+= 30;
                    
break;
                
case 2:
                    
if(IsLeapYear(m_year))
                        retDays 
+= 29;
                    
else
                        retDays 
+= 28;
                    
break;
            }
            
        }

        retDays 
+= m_day;

        
return retDays;
    }
    
}
;//end class DATETIME


int n;//题目给出的年数
int weekCount[7];//每个星期出现的次数

void Init()
ExpandedBlockStart.gifContractedBlock.gif
{
    ifstream fin (
"friday.in");
        fin
>>n;
        
for(int i=0; i<7; i++)
            weekCount[i] 
= 0;
    fin.close();
}


void Run()
ExpandedBlockStart.gifContractedBlock.gif
{
    
//统计每个13号的星期数
    for(int i=1900; i<1900+n; i++)
        
for(int j=1; j<=12; j++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            DATETIME date 
= DATETIME(i,j,13);
            
int week = date.GetWeek();
            weekCount[week]
++;
        }

}


void Show()
ExpandedBlockStart.gifContractedBlock.gif
{
    ofstream fout (
"friday.out");
    
for(int i=0; i<7; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
if(i != 6)
            fout
<<weekCount[(i+6% 7]<<' ';
        
else
            fout
<<weekCount[(i+6% 7];
    }

    fout
<<endl;
    fout.close();
}


int main() 
ExpandedBlockStart.gifContractedBlock.gif
{
    Init();
    Run();
    Show();
    
return 0;
}

转载于:https://www.cnblogs.com/SDJL/archive/2008/09/08/1286808.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值