算法>蓝桥杯-----任意年月日历输出

已知2007年1月1日为星期一。
设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。
为完成此函数,设计必要的辅助函数可能也是必要的。其中输入为年分和月份。
样例输入: 
2007  1
样例输出:
Calendar 2007-01
---------------------
 Su Mo Tu We Th Fr Sa
---------------------
     1  2  3  4  5  6
  7  8  9 10 11 12 13
 14 15 16 17 18 19 20
 21 22 23 24 25 26 27
 28 29 30 31
---------------------

2007  1
样例输出:
Calendar 2007-01
---------------------
 Su Mo Tu We Th Fr Sa
---------------------
     1  2  3  4  5  6
  7  8  9 10 11 12 13
 14 15 16 17 18 19 20
 21 22 23 24 25 26 27
 28 29 30 31
---------------------
样例输入: 
2010  9
样例输出:
Calendar 2010-09
---------------------
 Su Mo Tu We Th Fr Sa
---------------------
           1  2  3  4
  5  6  7  8  9 10 11
 12 13 14 15 16 17 18
 19 20 21 22 23 24 25
 26 27 28 29 30
---------------------

2010  9
样例输出:
Calendar 2010-09
---------------------
 Su Mo Tu We Th Fr Sa
---------------------
           1  2  3  4
  5  6  7  8  9 10 11
 12 13 14 15 16 17 18
 19 20 21 22 23 24 25
 26 27 28 29 30
---------------------
注意:短线“-”个数要与题目中一致,否则系统会判为错误。
 思路:把当月前的全部天数加起来%7即为开始天,具体程序如下,编程语言是C语言
//蓝桥杯 算法提高 任意年月日历输出
#include <stdio.h>
int main() {
	int year, month, t;//t=1代表闰年
	int Y = 2007, M = 1, D = 1 , W = 1; 
	int day=1;  //默认天数为1 
	int i;
	int j;
	int k=1;
	int d[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//每个月多少天
	scanf("%d %d", &year, &month);
	
	if(year<2007)return 0;   //2007年之前的不输出

	printf("---------------------\n");
	printf(" Su Mo Tu We Th Fr Sa\n");
	printf("---------------------\n");
	
//  if(year % 4 == 0 && year % 100 != 0 || (year%400 == 0)) {
//		t = 1;
//	}
//	else {
//		t = 0;
//	}
//上面的代码是判断是否闰年的

	
	if(year==Y) {     //如果年数相同
		if(month==M) {  //如果月数相同
			day=1;
			i=M;
		}
		else {          //如果月数不相同
			for(i = M; i < month; i++) {
				day = day + d[i];
			}
		}
	}
	else {            //如果年数不相同
		for(i = Y; i < year; i++) { //把不包括这一年的天数加上
			if((i % 4 == 0 )&& (i % 100 != 0) || (i % 400 == 0)) {
				day = day + 366;
			}
			else {
				day = day + 365;
			}
		}
		if((i % 4 == 0 )&& (i % 100 != 0) || (i % 400 == 0)) {
			d[2]=29;    //看看输入的这一年是不是闰年,闰年就2月变成29天
		}
		for(i = M; i < month; i++) {//把不包括这一月的天数加上
			day = day + d[i];
		}
	}
	
	day=day % 7;
	
	for(j=0;j<day;j++){ //j用来计一行的数,
		printf("   ");  //3个空格
	}
	do{
		printf("%3d",k); //k代表一个月的日,从1开始
		k++;
		j++;
		if(j==7){   //到星期六了就转行
			j=0;    //j重置为0
			printf("\n");
		}
	}while(k<=d[i]);  //i代表当前月,d[i]就是当前月有多少天
	if(j!=0){    //最后一天要不是星期六就换行
		printf("\n");
	}
	printf("---------------------");
	return 0;
}

 
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值