思路:1.首先你必须给一个基准年 ,在给出这一年的某一天,是星期几 例如 2000 1 1 星期6
2.那如何求2000 2 1是星期几呢?(1月1号的星期6+一月的天数)%7 要考虑平年闰年 2月天数不一样
3.那如何求2001 1 1是星期几?(2000年的一月一号+2000年的天数)%7 要考虑平年闰年天数不一样
根据以上规律,要求出某年某月的日历,按照步骤3,只要先求出某年的1月1号星期几,再求出这一年某月的1号是星期几 即可.
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int IsLeapYear ( int year ) { if ( (year % 4)==0 && (year % 100)!=0 || (year % 400)==0 ) return 1; else return 0; } int main ( ) { int months[2][13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int base_year=2000; int base_weak = 6; int year; int month; printf ( "year-month" ); scanf ( "%d%d", &year, &month ); //求出当前年一月一号星期几 int i; int total_days = 0; for ( i = base_year; i < year; i++ ) { total_days += (365 + IsLeapYear ( i )); } int year_first = (total_days +base_weak ) % 7; total_days = 0; for ( i = 1; i < month; i++ ) { total_days += months[IsLeapYear ( year )][i]; } int month_first = (total_days + year_first) % 7;//当前月一号是星期几 printf ( "sun mon tue wed tus fri sat\n" ); for ( i = 0; i < month_first; i++ ) { printf ( " " ); } for ( i = 1; i <= months[IsLeapYear ( year )][month]; i++ ) { printf ( "%4d", i ); if ( (month_first + i) % 7 == 0 ) { printf ( "\n" ); } } system ( "pause" ); return 0; }