P1202 [USACO1.1] 黑色星期五Friday the Thirteenth

展示了如何使用C语言实现一个计算特定日期13号在不同星期出现次数的程序,适用于USACOTrainingSection1.1的编程挑战。
摘要由CSDN通过智能技术生成

题目描述

1313 号又是一个星期五,那么 1313号在星期五比在其他日子少吗?

为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。给出 �n 年的一个周期,要求计算 19001900 年 11 月 11 日至 1900+�−11900+n−1 年 1212 月 3131 日中十三号落在周一到周日的次数。

这里有一些你要知道的:

  1. 19001900 年 11 月 11 日是星期一。
  2. 4,6,114,6,11 和 99 月有 3030 天,其他月份除了 22 月都有 3131 天,闰年 22 月有 2929 天,平年 22 月有 2828 天。
  3. 年份可以被 44 整除的为闰年(1992=4×4981992=4×498 所以 19921992 年是闰年,但是 19901990 年不是闰年)。
  4. 以上规则不适合于世纪年。可以被 400400 整除的世纪年为闰年,否则为平年。所以,1700,1800,1900,21001700,1800,1900,2100 年是平年,而 20002000 年是闰年。

输入格式

一个正整数 �n。

输出格式

依次输出周六、日、一、二、三、四、五在 1313 日出现的次数。

输入输出样例

输入 #1复制

20

输出 #1复制

36 33 34 33 35 35 34

说明/提示

【数据范围】
对于 100%100% 的数据,1≤�≤4001≤n≤400。

题目翻译来自NOCOW。

USACO Training Section 1.1



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 1000
typedef struct
{
    int a[9];
}Data;
void Init(Data &a)
{
    int i = 0;
    for (i = 0; i <= 7; i++)
        a.a[i] = 0;
}
int judge(int year, int month, int day) //判断某日是某年的第几天
{
    int run[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
    int ping[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
    int sum = 0, i;
    if ((year % 4 == 0 & year % 100 != 0) || (year % 400 == 0))
    {
        for (i = 0; i < month - 1; i++)
        {
            sum += run[i];
        }
        sum += day;
        return sum;
    }
    else
    {
        for (i = 0; i < month - 1; i++)
        {
            sum += ping[i];
        }
        sum += day;
        return sum;
    }
}
int Wday(int year) //返回某年的一月一日是周几
{
    int sum = 0, n, i, t;
    for (i = 1900; i < year; i++)
    {
        t = judge(i, 12, 31);
        sum = t + sum;
    }
    t = (sum + 1) % 7;
    return t;
}
void jisuan(Data &a, int fir, int year)//计算某年的13日,fir为该年1月1日为周几
{
    int i, sum, t;
 
    for (i = 1; i <= 12; i++)
    {
        sum = judge(year, i, 13);
        t = (sum - 1) % 7;
        switch (t)
        {
        case 0:a.a[fir%7]++; break;
        case 1:a.a[(fir+1)%7]++;  break;
        case 2:a.a[(fir+2)%7]++; break;
        case 3:a.a[(fir+3)%7]++; break;
        case 4:a.a[(fir+4)%7]++; break;
        case 5:a.a[(fir+5)%7]++; break;
        case 6:a.a[(fir+6)%7]++; break;
        }
    }
}
int main()
{
    Data data;
    int n, j, day, t;
    Init(data);
    scanf("%d", &n);
    for (j = 0; j < n; j++)
    {
        t = Wday(1900 + j);
        jisuan(data, t, 1900 + j);
    }
    printf("%d %d %d %d %d %d %d\n", data.a[6], data.a[0], data.a[1], data.a[2], data.a[3], data.a[4], data.a[5]);
    return 0;
}

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值