为万年历写的几个有用的小方法,供大家参考讨论
int day[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int first_day = 0;
int add_value = 0;
char *week[7] = {"周日", "周一","周二","周三","周四","周五","周六"};
//计算输入年份是否为闰年
bool isLeap(int year)
{
return ((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0));
}
//计算输入年份第一天是星期几
void Init(int year)
{
add_value = isLeap(year);
day[1] = 28 + add_value;//如果输入年为闰年,2月份的天数为29
first_day = (year + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7;//计算出输入年第一天为周几
}
//计算到输入年份的当前月的距离
int get_distance(int month)
{
//初始化一个数组,保存每个月的距离,同时考虑了闰年和平年的不同情形
int distance[12] = {0, 31, 59 + add_value, 90 + add_value, 120 + add_value,
151 + add_value, 181 + add_value, 212 + add_value,
243 + add_value, 273 + add_value, 304 + add_value, 334 + add_value};
return distance[month - 1];
}
//计算输入的日期是星期几
int get_current_day(int year, int month, int date)
{
//注释掉的方法已被get_distance(int month)替代
/*int total = 0;
for(int i = 0 && month > 1; i <= month - 2; i++)
{
total += day[i];
}*/
int currenet_day = 0;
Init(year);
int total = get_distance(month);
currenet_day = ( first_day + total + date - 1) % 7;
return currenet_day;
}
//将获取的current_day转换成字符串形式
char* convert_to_string(int current_day)
{
return week[current_day];
}
int count_leap(int year)
{
//具体的算法是计算出能被4整除的数个数与能被400整除的数个数之和(就是闰年的个数),再减去能被100整除的数个数(就是同时能被4和400整除的数个数)
//这样就能获得截止到输入年的闰年的个数
return year / 4 + year / 400 - year / 100;
//注释掉的方法已被return year / 4 + year / 400 - year / 100; 替代
/*int total = 0;
for(int i = 1; i <= year; i++)
{
if(isLeap(i))
total++;
}
return total;*/
}
假如高手有更好的方法,请不吝赐教,如果只有口水,免开尊口。如果有不明白的地方,我会尽力解答。总之大家一起讨论交流,共同提高。