方法一:
题目要求打印12月的日历,第一行一定是一样的,我们放在一个字符串s中,然后就只剩下两部分需要考虑了,一是从星期几开始,二是一个月要打多少天。
第一部分可以这样考虑,题目中已经给出了9月的日历,可以发现是从星期一开始的,也就是没有空格,这点性质很好,我们接下来这样考虑:如果比到9.1这一天每多一天,就应该多一个空格,当然,因为日历会换行,最多也就是多六个空格,那么就有对应六种情况,分别是多:0、1、2、3、4、5、6个空格,同样的,每当比到9.1这一天少一天,就会有6、5、4、3、2、1、0个空格(因为如果比九月少会从上一月的最后一天开始),那么很容易想到对7取余,如果小于0就加上7,刚好是要打印的空格数。我们用一个前缀和数组处理某月到9.1隔了多少天。
接下来就只剩下打印日期了,我们把每个月的日期存下来,打印m[i]次即可,每当空格加上当前打印天数是7的倍数,就换行,当然,要注意空格以及向右对齐。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s = "MON TUE WED THU FRI SAT SUN";
int m[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int sum[13] = { 0 };
for (int i = 1; i <= 12; i++)
{
sum[i] = sum[i - 1] + m[i];//前缀和数组,到某月的总共天数
}
int base = sum[8]+1;//到9.1号的总共天数
int month;
cin >> month;
int space_num = (sum[month - 1] + 1 - base) % 7;//每月月初到9.1日期的间隔
if (space_num < 0)//小于零说明月份比九月小
space_num += 7;
cout << s << endl;
for (int i = 0; i < space_num; i++)//处理空格
{
cout << " ";
}
int i = 0;
while (i < m[month])
{
printf("%3d ", i + 1);//%3d表示宽度为3,不足用空格填充
i++;
if ((i+space_num) % 7 == 0)
cout << endl;
}
}
方法二:
打开你的日历,
接下来打表即可。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s = "MON TUE WED THU FRI SAT SUN";
int m_d[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
string m[] = { " "," 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 " };
int space_num[] = { 0,2,5,5,1,3,6,1,4,0,2,5,0 };
int month;
cin >> month;
cout << s << endl;
for (int i = 0; i < space_num[month]; i++)
{
cout << m[0];
}
int i = 0;
while (i < m_d[month])
{
cout << m[i+1];
i++;
if ((i + space_num[month]) % 7 == 0)
cout << endl;
}
}

京公网安备 11010502036488号