每日一题

59 篇文章 0 订阅
49 篇文章 1 订阅

和中国的节日不同,美国的节假日通常是选择某个月的第几个星期几这种形式,因此每一年的放假日期都不相同。具体规则如下:

  • 1月1日:元旦
  • 1月的第三个星期一:马丁·路德·金纪念日
  • 2月的第三个星期一:总统节
  • 5月的最后一个星期一:阵亡将士纪念日
  • 7月4日:美国国庆
  • 9月的第一个星期一:劳动节
  • 11月的第四个星期四:感恩节
  • 12月25日:圣诞节
    现在给出一个年份,请你帮忙生成当年节日的日期。

输入描述:
输入包含多组数据,每组数据包含一个正整数year(2000≤year≤9999)。

输出描述:
对应每一组数据,以“YYYY-MM-DD”格式输出当年所有的节日日期,每个日期占一行。

每组数据之后输出一个空行作为分隔。
示例1
输入
2014
2013
输出
2014-01-01
2014-01-20
2014-02-17
2014-05-26
2014-07-04
2014-09-01
2014-11-27
2014-12-25

2013-01-01
2013-01-21
2013-02-18
2013-05-27
2013-07-04
2013-09-02
2013-11-28
2013-12-25
手动实现:

#include <iostream>
#include <cstdio>
// 根据 年-月-日 通过蔡勒公式计算当前星期几
// 1: 星期一 ... 7: 星期日
int day_of_week(int year, int month, int day)
{
    if (month == 1 || month == 2)
    {
        month += 12;
        year -= 1;
    }
    int century = year / 100;
    year %= 100;
    int week = year + (year / 4) + (century / 4) - 2 * century + 26 * (month + 1) / 10 + day -
        1;
    week = (week % 7 + 7) % 7;
    if (week == 0)
    {
        week = 7;
    }
    return week;
}
int day_of_demand(int year, int month, int count, int d_of_week)
{
    int week = day_of_week(year, month, 1); //求出1号星期数
    // 1 + 7(n - 1) + (所求星期数 + 7 - 1号星期数) % 7
    int day = 1 + (count - 1) * 7 + (7 + d_of_week - week) % 7;
    return day;
}
// 元旦
void new_year_day(int year)
{
    printf("%d-01-01\n", year);
}
// 马丁·路德·金纪念日(1月的第三个星期一)
void martin_luther_king_day(int year)
{
    printf("%d-01-%02d\n", year, day_of_demand(year, 1, 3, 1));
}
// 总统日(2月的第三个星期一)
void president_day(int year)
{
    printf("%d-02-%02d\n", year, day_of_demand(year, 2, 3, 1));
}
// 阵亡将士纪念日(5月的最后一个星期一)
void memorial_day(int year)
{
    // 从 6 月往前数
    int week = day_of_week(year, 6, 1);
    // 星期一的话,从 31 号往前数 6 天,否则,数 week - 2 天
    int day = 31 - ((week == 1) ? 6 : (week - 2));
    printf("%d-05-%02d\n", year, day);
}
// 国庆
void independence_day(int year)
{
    printf("%d-07-04\n", year);
}
// 劳动节(9月的第一个星期一)
void labor_day(int year)
{
    printf("%d-09-%02d\n", year, day_of_demand(year, 9, 1, 1));
}
// 感恩节(11月的第四个星期四)
void thanks_giving_day(int year)
{
    printf("%d-11-%02d\n", year, day_of_demand(year, 11, 4, 4));
}
// 圣诞节
void christmas(int year)
{
    printf("%d-12-25\n", year);
}
// 美国节日
void holiday_of_usa(int year)
{
    new_year_day(year);
    martin_luther_king_day(year);
    president_day(year);
    memorial_day(year);
    independence_day(year);
    labor_day(year);
    thanks_giving_day(year);
    christmas(year);
}
int main()
{
    int year;
    while (std::cin >> year)
    {
        holiday_of_usa(year);
        putchar('\n');
    }
}

蔡勒公式 :
详情参考百度百科 https://baike.baidu.com/item/%E8%94%A1%E5%8B%92%E5%85%AC%E5%BC%8F/10491767?fr=aladdin

#include <stdio.h>

int cvrt(int y, int m, int c, int w, bool B) {//输入哪年哪月第几个星期几,以及正数还是倒数,输出几号
    int d,
        week,
        i;
    if (m == 1)
    {
        m = 13;
        y--;
    }//公式要求1月、2月要转为上一年13、14月
    if (m == 2)
    {
        m = 14;
        y--;
    }
    i = 0;
  
    for (d = B ? 1 : 31; d <= B ? 31 : 1; B ? (d++) : (d--))
    {
        week = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;//蔡勒公式
        if (week + 1 == w)
            ++i;
        if (i == c)
            break;
    }
    return d;
}
  
int main()
{
    int y;
    while (scanf("%d", &y) != EOF)
    {
        printf("%d-01-01\n", y);
        printf("%d-01-%02d\n", y, cvrt(y, 1, 3, 1, 1));
        printf("%d-02-%02d\n", y, cvrt(y, 2, 3, 1, 1));
        printf("%d-05-%02d\n", y, cvrt(y, 5, 1, 1, 0));//倒数
        printf("%d-07-04\n", y);
        printf("%d-09-%02d\n", y, cvrt(y, 9, 1, 1, 1));
        printf("%d-11-%02d\n", y, cvrt(y, 11, 4, 4, 1));
        printf("%d-12-25\n\n", y);
    }
    return 0;
}

所谓因子分解,就是把给定的正整数a,分解成若干个素数的乘积,即 a = a1 × a2 × a3 × … × an,并且 1 < a1 ≤ a2 ≤ a3 ≤ … ≤ an。其中a1、a2、…、an均为素数。 先给出一个整数a,请输出分解后的因子。

输入描述:
输入包含多组数据,每组数据包含一个正整数a(2≤a≤1000000)。

输出描述:
对应每组数据,以“a = a1 * a2 * a3…”的形式输出因式分解后的结果。
示例1
输入
10
18
输出
10 = 2 * 5
18 = 2 * 3 * 3

#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;

int main()
{
    int n;
    while(cin >> n && n >= 2)
    {
        printf("%d =",n);
        for(int i = 2; i <= sqrt(n); ++i)
        {
            while(n % i == 0 && i <= n / i)
            {
                printf(" %d *",i);
                n /= i;
            }
        } 
        printf(" %d",n);
        cout << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值