难点在于找到距离设定的基准日期的天数
1600年1月1日是周六
因此距离这一天00:00的天数如果是7的倍数,那么这天也是周六
故统计目标年份月份的1号距离1600年1月1日00:00的天数days
(days+5)%7便是该月日历中需要先输出的空格
全部加起来不过50行代码
//万年历1600年1月1日--星期六
#include <stdio.h>
int main(){
int year, month, day;
int i, j, cnt = 0; //cnt输出日历时用于计数
int arr[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char str[7][16] = {"一", "二", "三", "四", "五", "六", "日"};
printf("请输入年/月/日(1600起):");
scanf("%d/%d/%d", &year, &month, &day);
while(year < 1600 || month < 1 || month > 12 || day < 1 || day > arr[month-1]){
if(year%4 == 0 && year%100 != 0 || year%400 == 0){
if(month == 2 && day == 29) break; //特殊日子一个退出循环条件
}
printf("输入日期有误,请重新输入:");
scanf("%d/%d/%d", &year, &month, &day);
}
int days = 0; //以下两个for循环记录所有月份总天数days,其实闰年加2,平年加1就行了
for(i = 1600; i < year; i++){
if(i%4 == 0 && i%100 != 0 || i%400 == 0){
days+=1;
}
days+=365;
}
if(year%4 == 0 && year%100 != 0 || year%400 == 0){
arr[1]++;
}
for(i = 0; i < month-1; i++){
days+=arr[i];
}
printf("%d年%d月%d日是星期%s.\n", year, month, day, str[(days+day+4)%7]);
printf("%d年%d月\n", year, month);
printf("一\t二\t三\t四\t五\t六\t日\n"); //输出开头
for(i = 0; i < (days+5)%7; i++){
printf(" \t");
cnt++;
}
for(i = 1; i <= arr[month-1]; i++){
printf("%d\t", i);
cnt++;
if(cnt%7 == 0){
printf("\n");
}
}
return 0;
}
出的空格