首页 > 其他分享 >月历(感觉自己思路还可以)

月历(感觉自己思路还可以)

时间:2025-01-07 18:32:38浏览次数:7  
标签:int 31 month ++ location 感觉 year 思路 月历

一、题目

【问题描述】

输入年份和月份, 输出该月的月历。

【输入形式】

输入包含两个整数Y(Y>1920)和M(1<=M<=12),分别表示年份和月份

【输出形式】

 阵列式月历,数字间用空格分隔。

【样例输入】

  2016  11

二、思路:
开始是想一个一个找,用二维数组把每个数字都变一下。后面发现可以只找一个“定位1”,即只要找到这个月份的一号。观察日历,发现有两个小规律:

规律一:

与上年相比,今年的一月一号比上一年星期上多了一天或多两天,即:如果去年一月一号是周二且去年是平年,今年一月一号就是周三。如果是闰年,今年一月一号就是周四。

规律二:

与上个月相比,这个月的一号比上个月星期上多了0~3天,即如果上个月有28天,这个月的一号和上个月一号的星期相同,29天就+1,30天就+2;31天就+3;

三、代码实现

1.有了这两个规律,就很好写了。先来两个会用到的函数,判断闰年和计算某年某个月有多少天

bool leap_year(int year) {
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
		return true;		//是闰年
	}
	return false;
}
int cal_day(int year,int month) {		//计算当月有多少天
	int result = 0;
	int kk[12] = { 31 ,28,31,30,31,30,31,31,30,31,30,31 };	//bug1:kk初始化已经固定,不会被temp的变化修改
	if (leap_year(year) && month == 2) return 29;
	else result = kk[month - 1];
		return result;
}

2.初始处理,因为题目的数据是从Y>1920,我就把1921年一月一号作为所有数据的开始;

另外先把第一行输出了。

main外我定义了个二维数组,在这里也给它初始化一下,方便最后输出时遇到0就输出空格

int arr[6][7];
int Y, M;
cin >> Y >> M;
for (int i = 0; i < 6; i++) {
	for (int j = 0; j < 7; j++) {
		arr[i][j] = 0;
	}
}
cout << "Sun Mon Tus Wed Thu Fri Sat" << endl;

int  location_x = 0,location_y =6, year =1921,month = 1,day =1;			//该月天数,1921年一月一号的位置

3.先找这一年的一号,再找这一月的一号

//找到当年一月一号的位置
while (year < Y) {
	if (leap_year(year)) {
		location_y += 2;
	}
	else location_y++;
	year++;
}
location_y %= 7;
//找到M月一号的位置(28不变,29+1,30+2,31+3)

while (month < M) {
	if (cal_day(year, month) == 29)  location_y += 1;
	else if (cal_day(year, month) == 30) location_y += 2;
	else if (cal_day(year, month) == 31) location_y += 3;
	month++;
	//cout << location_y << ' ';
}
location_y %= 7;

4.最后填充二维数组,再输出

//填充二维数组
int this_day = cal_day(year, month);
for (int i = 0; i < this_day; i++) {
	arr[location_x][location_y++] = day++;
	if (location_y > 6) {
		location_y %= 7;
		location_x++;
	}
}

//输出结果
for (int i = 0; i < 6; i++) {
	for (int j = 0; j < 7; j++) {
		if (arr[i][j] == 0) {
			if (j == 0) cout << "   ";
			else cout << "    ";
		}
		else
			if (j == 0) cout <<right<< setw(3) <<arr[i][j];
			else cout << right <<setw(4) <<arr[i][j];
	}
	cout << endl;
}

四、完整代码

#include<iostream>
#include<iomanip>
using namespace std;

int arr[6][7];
bool leap_year(int year) {
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
		return true;		//是闰年
	}
	return false;
}
int cal_day(int year,int month) {		//计算当月有多少天
	int result = 0;
	int kk[12] = { 31 ,28,31,30,31,30,31,31,30,31,30,31 };	//bug1:kk初始化已经固定,不会被temp的变化修改
	if (leap_year(year) && month == 2) return 29;
	else result = kk[month - 1];
		return result;
}

int main() {

	int Y, M;
	cin >> Y >> M;
	for (int i = 0; i < 6; i++) {
		for (int j = 0; j < 7; j++) {
			arr[i][j] = 0;
		}
	}
	cout << "Sun Mon Tus Wed Thu Fri Sat" << endl;

	int  location_x = 0,location_y =6, year =1921,month = 1,day =1;			//该月天数,1921年一月一号的位置
	//找到当年一月一号的位置
	while (year < Y) {
		if (leap_year(year)) {
			location_y += 2;
		}
		else location_y++;
		year++;
	}
	location_y %= 7;
	//找到M月一号的位置(28不变,29+1,30+2,31+3)
	
	while (month < M) {
		if (cal_day(year, month) == 29)  location_y += 1;
		else if (cal_day(year, month) == 30) location_y += 2;
		else if (cal_day(year, month) == 31) location_y += 3;
		month++;
		//cout << location_y << ' ';
	}
	location_y %= 7;
	//cout << location_y << endl;
	int this_day = cal_day(year, month);
	for (int i = 0; i < this_day; i++) {
		arr[location_x][location_y++] = day++;
		if (location_y > 6) {
			location_y %= 7;
			location_x++;
		}
	}

	for (int i = 0; i < 6; i++) {
		for (int j = 0; j < 7; j++) {
			if (arr[i][j] == 0) {
				if (j == 0) cout << "   ";
				else cout << "    ";
			}
			else
				if (j == 0) cout <<right<< setw(3) <<arr[i][j];
				else cout << right <<setw(4) <<arr[i][j];
		}
		cout << endl;
	}







	return 0;
}

标签:int,31,month,++,location,感觉,year,思路,月历
From: https://blog.csdn.net/2403_87544412/article/details/144944902

相关文章

  • 神经网络误差反向传播思路整理
    神经网络的误差反向传播,初次接触的时候,感觉思路并不复杂,但其中包含许多细节,容易产生迷惑。今天整理一下思路,仅供参考。一、神经网络的定义最常见的神经网络长这个样子,包含一个输入层、若干隐藏层和一个输出层。输入向量:第层的权重矩阵:第层的偏置向量:第层的输出:神经网络......
  • 【项目经理】面试常见难题大全及回答思路和回答实例参考
    一、人际交往能力问题1、管理团队中利益相关方之间的冲突思路:首先要表明你对冲突管理的重视,然后描述一个具体的冲突场景,重点在于你如何倾听各方的观点,寻找共同利益点,并通过沟通和协商达成解决方案。示例回答:“在之前的项目中,我们的研发团队和市场团队在产品发布时间上有冲突。......
  • 大规模高性能云网络技术思路
    本文分享自天翼云开发者社区《大规模高性能云网络技术思路》,作者:程****超控制面基础架构采用微服务架构模型,服务独立可扩展,可以根据每个服务的规模来部署满足需求的实例。具体网络控制面技术方案如图 数据面通过多TC实现网络的高可靠性,TC故障时,流量会被切换到另外一个TC。网元......
  • 【案例实操】Stable Diffusion 将产品白底图变成电商模特场景图全流程思路分享
    大家好我是AIGC阿道夫前言:在电商的视觉战场上,产品展示图的吸引力关乎成败。白底图虽简洁,却难在竞争中脱颖而出。本案例实操将为你揭秘如何利用StableDiffusion扭转乾坤,把单调白底图转化为吸睛的电商模特场景图,开启创意无限的电商视觉营销新篇章。今天分享一下SD模特......
  • #渗透测试#漏洞挖掘#WAF分类及绕过思路
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。目录一、Waf分类软件型WAF硬件型WAF基于云WAF开源型WAF......
  • 信息收集补充思路
    免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!!附:完整笔记目录~ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正!六、信息收集补充思路引子:前几章分别介绍了针对不同目标的信息收集内容&方式&工具,本章内容则并非针对某一具体目标,......
  • 写一个小程序的拖动组件,请说说你的思路
    当开发一个拖动组件时,我的思路会大致遵循以下步骤:明确需求:确定拖动组件的基本功能,例如拖动范围、拖动限制、拖动效果等。考虑是否需要与其他组件交互,如拖放功能。确定组件的适用场景,如页面内的拖动排序、拖动调整尺寸等。技术选型:选择合适的前端框架或库,如React、Vue......
  • 如何封装一个小程序的网络请求库?请说说你的思路
    封装一个小程序的网络请求库可以帮助你统一处理网络请求,添加全局配置,以及简化代码。以下是一个基本的思路,指导你如何封装一个小程序的网络请求库:确定需求和功能:支持GET、POST等常见HTTP方法。能够设置全局请求头、超时时间等。提供错误处理和重试机制。返回Promise,支持asy......
  • 从 LB Ingress 到 ZTM:集群服务暴露新思路
    12月28日,KubeSphere社区联合Higress社区主办的云原生AIMeetup广州站成功召开,我们非常荣幸邀请到CNCFAmbassador、Flomesh社区布道师——张晓辉老师,张老师为大家带来了一场主题为「从LBIngress到ZTM:集群服务暴露新思路」的主精彩分享。以下为演讲实录,干货满满!感......
  • 【案例实操】Stable Diffusion 将产品白底图变成电商模特场景图全流程思路分享
    前言:在电商的视觉战场上,产品展示图的吸引力关乎成败。白底图虽简洁,却难在竞争中脱颖而出。本案例实操将为你揭秘如何利用StableDiffusion扭转乾坤,把单调白底图转化为吸睛的电商模特场景图,开启创意无限的电商视觉营销新篇章。今天分享一下SD模特+化妆品,艺术创作的教程......