日期的标准输出格式: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;
}
以上就是这篇的主要内容,欢迎指出错误和提出改良意见,谢谢!