难点在于找到距离设定的基准日期的天数
1600年1月1日是周六
因此距离这一天00:00的天数如果是7的倍数,那么这天也是周六
故统计目标年份月份的1号距离1600年1月1日00:00的天数days
(days+5)%7便是该月日历中需要先输出的空格
全部加起来不过50行代码
//万年历1600年1月1日--星期六 #includeint 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("%dt", i); cnt++; if(cnt%7 == 0){ printf("n"); } } return 0; }
出的空格
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)