计算xx年xx月xx日是星期几
代码:
#include <iostream>
#include <string>
#include <vector> using namespace std; int hashMapping(int mouth)
{
vector<int> days{31,28,31,30,31,30,31,31,30,31,30,31};
return days[mouth - 1];
} int IsLeapYear(int year, int mouth)
{
if(((year%4 == 0 && year%100 != 0) || (year%400 == 0)) && mouth == 2)
{
return hashMapping(mouth) + 1;
}
return hashMapping(mouth);
} int CalculateDays(int start_year, int end_year, int start_mouth, int end_mouth)
{
int days = 0;
if (end_mouth >= start_mouth)
{
if (start_year < end_year)
{
for (int i = start_year; i < end_year; i++)
{
for (int j = start_mouth; j <= 12; j++)
days += IsLeapYear(i, j);
for (int j = 1; j <= end_mouth; j++)
days += IsLeapYear(i, j);
}
}
else
{
for (int j = start_mouth; j <= end_mouth; j++)
days += IsLeapYear(start_year, j);
}
}
else
{
for (int i = start_year; i < end_year; i++)
{
for (int j = start_mouth; j <= 12; j++)
days += IsLeapYear(i, j);
for (int j = 1; j <= end_mouth; j++)
days += IsLeapYear(i, j);
}
} return days;
} string hashFunc(int days, int week)
{
vector<string> str{"星期一","星期二","星期三","星期四","星期五","星期六","星期天"};
return str[(week - 1 + days%7)%7];
} void PrintWeek(int start_year, int start_mouth, int start_day, int week, int end_year, int end_mouth, int end_day)
{
string we;
int days;
switch(week)
{
case 1:
days = CalculateDays(start_year, end_year, start_mouth, end_mouth) - (start_day + IsLeapYear(end_year, end_mouth) - end_day);
we = hashFunc(days, week);
break;
case 2:
days = CalculateDays(start_year, end_year, start_mouth, end_mouth) - (start_day + IsLeapYear(end_year, end_mouth) - end_day);
we = hashFunc(days, week);
break;
case 3:
days = CalculateDays(start_year, end_year, start_mouth, end_mouth) - (start_day + IsLeapYear(end_year, end_mouth) - end_day);
we = hashFunc(days, week);
break;
case 4:
days = CalculateDays(start_year, end_year, start_mouth, end_mouth) - (start_day + IsLeapYear(end_year, end_mouth) - end_day);
we = hashFunc(days, week);
break;
case 5:
days = CalculateDays(start_year, end_year, start_mouth, end_mouth) - (start_day + IsLeapYear(end_year, end_mouth) - end_day);
we = hashFunc(days, week);
break;
case 6:
days = CalculateDays(start_year, end_year, start_mouth, end_mouth) - (start_day + IsLeapYear(end_year, end_mouth) - end_day);
we = hashFunc(days, week);
break;
case 7:
days = CalculateDays(start_year, end_year, start_mouth, end_mouth) - (start_day + IsLeapYear(end_year, end_mouth) - end_day);
we = hashFunc(days, week);
break;
}
cout << start_year << '/' << start_mouth << '/' << start_day <<
'~' << end_year << '/' << end_mouth << '/' << end_day << " 共有:"
<< days << "天 " << endl;
cout << end_year << "年" << end_mouth << "月" << end_day << "日是" << we << endl;
} int main()
{
int start_year, start_mouth, start_day;
int end_year, end_mouth, end_day;
int week; cout << "请输入起始年/月/日 以及 星期几:" << endl;
cin >> start_year;
cin >> start_mouth;
cin >> start_day;
cin >> week; cout << "请输入结束年/月/日:" << endl;
cin >> end_year;
cin >> end_mouth;
cin >> end_day; PrintWeek(start_year, start_mouth, start_day, week, end_year, end_mouth, end_day); return 0;
}
运行结果:
第二个版本:直接输入xx年xx月xx日 就可以计算日期为星期几:
#include <iostream>
#include <string>
#include <vector> using namespace std; //以 1890/1/1 星期三 为基准 int hashMapping(int mouth)
{
vector<int> days{31,28,31,30,31,30,31,31,30,31,30,31};
return days[mouth - 1];
} int IsLeapYear(int year, int mouth)
{
if(((year%4 == 0 && year%100 != 0) || (year%400 == 0)) && mouth == 2)
{
return hashMapping(mouth) + 1;
}
return hashMapping(mouth);
} int CalculateDays(int year, int mouth)
{
int days = 0; if (1890 < year)
{
for (int i = 1890; i < year; i++)
{
for (int j = 1; j <= 12; j++)
days += IsLeapYear(i, j);
}
for (int j = 1; j <= mouth; j++)
days += IsLeapYear(year, j);
}
else if(1890 > year)
{
for (int j = mouth; j <= 12; j++)
days += IsLeapYear(year, j);
for (int i = year + 1; i < 1890; i++)
{
for (int j = 1; j <= 12; j++)
days += IsLeapYear(i, j);
}
}
else
{
for (int j = 1; j <= mouth; j++)
days += IsLeapYear(1890, j);
} return days;
} string hashFunc(int days)
{
vector<string> str{"星期一","星期二","星期三","星期四","星期五","星期六","星期天"};
return str[(2 + days%7)%7]; // 因为是以星期三为基准 所以是下标2
} void PrintWeek(int year, int mouth, int day)
{
if ((year > 1889) && (mouth <= 12 && mouth >= 1) && (day <= 31 && day >= 1))
{
string we;
int days = CalculateDays(year, mouth) - (1 + IsLeapYear(year, mouth) - day);
if (1890 <= year)
we = hashFunc(days); cout << year << "年" << mouth << "月" << day << "日是 " << we << endl;
}
else
{
cout << "输入有误!" << endl;
exit(1);
}
} int main()
{
int year, mouth, day; cout << "请输入年/月/日:" << endl;
cin >> year;
cin >> mouth;
cin >> day; PrintWeek(year, mouth, day); return 0;
}
运行结果:
特殊的:
ps:1890/1/1 星期三 我是度娘知道的,所以也可以通过度娘检验我的程序结果的正确性。
程序不能计算1890年以前的。因为不知道为什么目前算法对往回算不正确。原本我是以2018/1/1 星期一为基准的 但就是发现输入过去的日期算法就不正确后,就尽量往以前的年份改,发现度娘的最早也就能算1890/1/1的,但足够用了,不过如果能将年份尽量处于中间段,往前后算的计算次数就会减少很多,虽然算法时间复杂度还是O(n^2)。
给个度娘截图:
计算xx年xx月xx日是星期几的更多相关文章
- 请使用switch语句和if...else语句,计算2008年8月8日这一天,是该年中的第几天。
请使用switch语句和if...else语句,计算2008年8月8日这一天,是该年中的第几天. #include <stdio.h> int main() { /* 定义需要计算的日期 ...
- 通过Calendar简单解析Date日期,获取年、月、日、星期的数值
有时候项目中需要用到Date的年.月.日.星期的数值.那么解析方法如下: /**解析日期,获取年月日星期*/ private void parseDateToYearMonthDayWeek(Date ...
- java8中计算两个日期时间LocalDateTime的时间差,格式化成xx年yy月zz日aa时bb分cc秒
原则上应该适用Period来计算,因为他是专门为这种需求设计的.当时他只能计算到两个时间差的,年月日 传入参数Period.between(LocalDate,LocalDate) 这里是计算两个Lo ...
- C# 根据年、月、周、星期获得日期等
原文:C# 根据年.月.周.星期获得日期等 /// 取得某月的第一天 /// </summary> /// <param name="datetime">要 ...
- JS对象 编程练习 某班的成绩出来了,现在老师要把班级的成绩打印出来。 效果图: XXXX年XX月X日 星期X--班级总分为:81
编程练习 某班的成绩出来了,现在老师要把班级的成绩打印出来. 效果图: XXXX年XX月X日 星期X--班级总分为:81 格式要求: 1.显示打印的日期. 格式为类似"XXXX年XX月XX日 ...
- 我的第一篇博客之js的XXXX年XX月XX日 星期[日一-六] [上下]午 XX时:XX分
<!DOCTYPE html> <html> <head> <title>test</title> ...
- 【BIRT】在页面上展示xxxx年xx月xx日
我们在做报表开发的时候经常会遇到一个问题,就是需要在报表上展示”xxxx年xx月xx日”这种日期,例如:需要在报表展示日期如下图: 我们现在数据库存储的日期是:20171231 那么我们如何转化为 这 ...
- 求当前时间100天后的时间日期,格式化为xxxx年xx月xx日
package com.demo1; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Da ...
- sql中把时间转换成xx年xx月xx日
DECLARE @dt datetime SET @dt=GETDATE()--1.短日期格式:yyyy-m-d SELECT STUFF(STUFF(CONVERT(char(8),@dt,112) ...
随机推荐
- Linux04——手动修改IP和关闭防火墙服务
两种方法手动修改IP: 命令行方式 2. 图形化界面修改 点击应用即可(地址自行设置) 关闭防火墙服务,否则连不上Linux
- Springmvc-crud-02错误(添加出现中文乱码)
错误: 在进行添加页面时使用post请求,输入中文时会出现乱码 原因: post请求不支持gbk格式,使用字符编码过滤器,设置为UTF-8编码即可 注意配置请求的字符集和响应字符集 解决方案:需要放在 ...
- Cosmetic Airless Bottles To Meet Practical Requirements
Today, people use cosmetic bottles, many of which are in cosmetic airless bottles. We can use them, ...
- oracle 12c pdb开启和关闭
oracle 12c pdb开启和关闭 //开启数据库 sqlplus / as sysdba; //登录连接CDB,默认是root container;startu ...
- 连接(JOIN)
join 用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. INNER JOIN 从多个表中返回满足 JOIN 条件的所有行. INNER JOIN:如果表中有至少一个匹配,则返回行 L ...
- [Python] Tkinter的食用方法_02_LabelFrame RadioButton CheckButton
#开始 Python的话 我是看的小甲鱼的视频 所以代码也是小甲鱼的修改版 本博客这里只是学习记录 小甲鱼是个很棒的老师,虽然经常飙车.... #第一个代码 from tkinter import * ...
- Python(四)生成器 和 杨辉三角
学习链接: http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143177992 ...
- MyBatis中关于session以及cache的管理
Mybatis中缓存分为一级缓存与二级缓存: 一级缓存指的只是缓存级别的一个命名,主要就是每个sqlsession里都有一个HashMap来存储数据,当然不同对象每个缓存区域也不一样,所以一级缓存是不 ...
- Fluent_Python_Part4面向对象,08-ob-ref,对象引用、可变性和垃圾回收
第四部分第8章,对象引用.可变性和垃圾回收 1. 创建对象之后才会把变量分配给对象 变量是对象的标注,是对象的别名,是对象的引用,并不是对象存储的地方. 例子1. 证明赋值语句的右边先执行 class ...
- 初学做uniapp项目过程梳理的一些记录
1.uniapp不显示h5头部 第一种写法: { "path" : "pages/yunshi/yunshi", "style" : { & ...