日期处理

日期的标准输出格式:yyyymmdd(y : year, m : month, d: day),例如:2000-05-01。

闰年的计算:什么是闰年?即年份可以被4整除但不能被100整除,或者可以被400整除。

判断闰年的参考代码:

bool isLeapYear(int year){
	return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

一、计算一年的第多少天

题目描述:输入年、月、日,计算该天是本年的第几天。

分析:这道题没有太大的难度,就是注意判断闰年2月份29天,其次就是如果是5月,月份阶段需要算的是前四个月。为了方便计算,我将存储每月多少天的数组第一位存为0,这样在月份是,直接判断<m 即可。

#include<iostream>
using namespace std;
bool isLeap(int year){
  return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main(){
int y, m, d;
    while(cin >> y >> m >> d){
        int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int sum = 0;
        if(isLeap(y)){
            a[2] = a[2] + 1;
}
        for(int i = 0; i < m; i ++){
        sum = sum + a[i];
        }
        sum = sum + d;
        cout << sum << endl;
}
    return 0;
}

二、黑色星期五

题目描述:黑色星期五源于西方的宗教信仰与迷信:耶稣基督死在星期五,而13是不吉利的数 字。两者的结合令人相信当天会发生不幸的事情。星期五和数字13都代表着坏运气,两个不幸的个体最后结合成超级不幸的一天。所以,不管哪个月的13日又恰逢星期五就叫“黑色星期五”。找出未来儿年哪些天是“黑色星期五”。

(1)通过数组将每个月1日到13日的天数表示出来(分闰年和平年),然后对7取余,根据余数确定是周几,注意输出周几是需要+1的,因为取余结果是0-6;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
bool isLeap(int year){
	return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 指定日期怎样求星期几?(当前日期到公元1年1月1日(星期一)的天数 % 7) 
// 0 1 2 3 4 5 6 ---- 对应一周七天 


int main(){

int year;
int ans = 0;
    //闰年的:每年一日到该月13日的天数 
    int Leap[] = {12, 31+12, 31+29+12, 31+29+31+12, 31+29+31+30+12, 31+29+31+30+31+12,
                  31+29+31+30+31+30+12, 31+29+31+30+31+30+31+12, 31+29+31+30+31+30+31+31+12, 
                  31+29+31+30+31+30+31+31+30+12, 31+29+31+30+31+30+31+31+30+31+12, 31+29+31+30+31+30+31+31+30+31+30+12 };
    //平年的:每年一日到该月13日的天数 
    int not_Leap[] = {12, 31+12, 31+28+12, 31+28+31+12, 31+28+31+30+12, 31+28+31+30+31+12, 
                      31+28+31+30+31+30+12, 31+28+31+30+31+30+31+12, 31+28+31+30+31+30+31+31+12, 
                      31+28+31+30+31+30+31+31+30+12, 31+28+31+30+31+30+31+31+30+31+12, 31+28+31+30+31+30+31+31+30+31+30+12};
    
    cin >> year;
    if (isLeap(year))
    {
        for (int i = 0; i < 12; i++)
        {
            if (((year-1)*365 + (year - 1)/4 - year/100 + year/400 + Leap[i] + 1) % 7 == 5) {
                cout <<  year << "-" << i + 1 << "-" << 13 << endl; 
            }
        }
    }
    else
    {
        for (int i = 0; i < 12; i++)
        {
            if (((year-1)*365 + (year)/4 - year/100 + year/400 + not_Leap[i] + 1) % 7 == 5) {
                    cout <<  year << "-" << i + 1 << "-" << 13 << endl; 
            }
    }
}
    return 0;
}
(2)基姆拉尔森计算公式   W = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y /400) % 7

 其中 d 表示日期中的日子 m表示日期中的月份 y 表示年份 y是不考虑闰年的情况 ,其中 1 ,2 月被当作了上一年的13月 和 14月处理。

#include<iostream>
using namespace std;
//公元0年1月1日星期日 开始 这个公式做了处理 是从日 - 年 - 月逐步推导的公式 有个误差的数组 
int date_processing(int year, int month, int day){
	if(month == 1 || month == 2){
		month += 12;
		year --;
	}
	return (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400 ) % 7 + 1; 
	// + 1是因为取余之后是从0开始 
}
int main(){
	int year, ans = 0;
	cin >> year;
	for(int i = 1; i <= 12; i ++){
		if(date_processing(year, i , 13) == 5){
			cout << year <<"-" << i << "-" << 13 << endl;
			ans ++;
		}
	}
	cout << ans << endl;
	return 0;
} 


以上就是这篇的主要内容,欢迎指出错误和提出改良意见,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值