原题链接:蓝桥杯算法提高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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复