思路: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;
}
