原题链接:蓝桥杯算法提高VIP-任意年月日历输出
解题思路:整个程序的思路是先确定那一年的1月1号是星期几,用k记录 ,然后再从那一年的一月推到指定月份的一号是星期几,依然用k记录 k的范围大小是0-6,0代表星期天
注意事项:
参考代码:
#include<iostream>
#include<iomanip>
using namespace std;
bool cmp(int x){
if(x%4==0&&x%100!=0) return true;
else if(x%400==0) return true;
else return false;
}
int cmp2(int x){
if(x==1||x==3||x==5||x==7||x==8||x==10||x==12) return 1;
else if(x==2) return 2;
else return 0;
}
int main(){
int year,month,k=1,z=1,days; //整个程序的思路是先确定那一年的1月1号是星期几,用k记录 ,然后再从那一年的一月推到指定月份的一号是星期几,依然用k记录 k的范围大小是0-6,0代表星期天
cin>>year>>month;
for(int i=2007;i<year;++i){
if(cmp(i)) k+=2; // 如果成立就代表着那一年为闰年,闰年366天,366余7=2,意味着下一年的一月一号是上一年的往后推两天。
else k++; //否则为平年365天,365余7=1,下一年的一月一号是上一年往后推一天
if(k>6) k-=7; //k代表者星期,若k'大于6等于7时,那么就让k等于0,意味着改天为星期天
} //这个for循环结束后,就可以得到该年的一月一号是星期几
for(int j=1;j<month;++j){ //同理由一月推到指定月份时,看是星期几
if(cmp2(j)==1) k+=3; //如果是奇数月则一个月有31天,31余7等于3,下个月一号星期就是这个月一号星期往后推三天。同理判断出偶数月和闰年2月和平年2月的变化情况
else if(cmp2(j)==2&&cmp(year)) k++; //闰年2月
else if(cmp2(j)==0) k+=2; //除二月的偶数月,平年的二月有28天,余7等于0,不用做变化。
if(k>6) k-=7;
}
if(cmp2(month)==1) days=31; //这四行语句判断这月有多少天
else if(cmp2(month)==2&&cmp(year)) days=29;
else if(cmp2(month)==0) days=30;
else days=28;
cout<<"---------------------"<<endl;
cout<<" Su Mo Tu We Th Fr Sa"<<endl;
cout<<"---------------------"<<endl;
for(int i=0;i<k;++i) //根据k值知道该月一号为星期几,注意空格大小,前面直接输出几个 空格就好
cout<<" ";
for(int z=1;z<=days;++z){
if(k>6){
k-=7;
cout<<endl; //当k大于6等于7时,输出回车
}
cout<<" "<<setw(2)<<z; //每次输出前输入一个空格,且控制两个空间输出且向右靠齐输出
k++;
}
cout<<endl<<"---------------------";
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复