一、题目要求
某人从1990年1月1日起开始“三天打渔两天晒网”,问这个人在以后的某一天是打渔还是晒网?
二、问题分析
这个问题,首先应该想到如果想要知道该人是打渔还是晒网,那就应该计算出从1990年1月1日到以后的某一天总共的天数,然后依据三天打渔两天晒网,用总天数对5做求模运算。这样该问题就可以简化为两大步:
1、求总天数
在求总天数中,又可细分几步。首先,根据用户输入的年月日计算这一天是该年的第几天,计算过程可写成函数int GetDays(int year,int month,int day),这里就需要知道这一年是平年还是闰年,因为后面多次用到判断一年为平年还是闰年,所以可以写成一个函数int LeapYear(int year);
然后计算从1990年到这一年总共经过的年数,根据年数可以计算出天数,该处继续用到平闰年的判断;
最后将计算得到的两种天数相加,即为从1990年1月1日起到用户输入的年月日止经过的总天数。
2、求模运算,打印结果
得到总天数后,对5做求模运算,若余数为1或2或3,表明他在打渔,若是其他情况,则表明他在晒网。
为了方便起见,我把用户输入的年月日直接用变量自己定义好,描述详见代码:
三、代码实现
//三天打渔两天晒网
int LeapYear(int year)
{
if(year%4 == 0 && year%100!=0 || year%4 == 0 && year%400 == 0)
{
return 1;
}
}
int GetDays(int year,int month,int day)
{
int sum = 0;
int m[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if(LeapYear(year) == 1)
{
m[1]++;
}
for(int i = 1;i < month;i++)
{
sum = sum + m[i-1];
}
sum = sum + day;
return sum;
}
int main()
{
int year = 1991;
int month = 12;
int day = 31;
int sum = 0;
for(int y = 1990;y < year;y++)
{
sum = sum + 365;
if(LeapYear(y) == 1)
{
sum++;
}
}
sum = sum + GetDays(year,month,day);
printf("从1990年1月1日到%d年%d月%d日有%d天\n",year,month,day,sum);
if(sum%5 == 1 || sum%5 == 2 || sum%5 == 3)
{
printf("他在打渔\n");
}
else
{
printf("他在晒网\n");
}
return 0;
}