------------------------------------------------------------------------------
打鱼还是晒网问题
-------------------------------------------------------------------------------
题目: 渔夫打渔,三天打渔两天晒网,从1990年1月1日从业,给出年月日,这天,是打渔还是晒网。
思路:当你看到这道题,也许也是没有思路,所以先慢慢分析
目标:1.解决那天打鱼还是晒网问题,,,,,你首先得知道这一年过了多少天,这样在就%5,就简单。
2.你解决一年过了多少天,就得先判断这一年过了多少天,再加上你从1990到现在过了多少年,剩余那是最麻烦的平年闰年问题;
3.还得再加一句,你的那个月份,得计算在这一年中你过了多少个月,这样子就可以几号直接一加(平年2月28,闰年2月29,在得判断一次闰年平年)
#include<stdio.h>
bool leap(int year)//判断是不是闰年
{
if((year % 4 == 0 && year % 100 != 0)||(year % 400 ==0))
{
return 1;
}
else
{
return 0;
}
}
int monthly(int year,int month ,int day)//判断到目前为止过了天数
{
int a[11] = {31,28,31,30,31,30,31,31,30,31,30};//一年十二月就变成了一个数组,这个数组是没有十二月份的这么解释,如果12月
//无论十几号,你只要把前11个月的加起来,再加上你十二月过了的天数,就是你的总天数
int rs = 0;//用它来保存天数
if(leap(year)==1) //平年和闰年的二月份不相同
{
a[1]= 29;
}
for(int i =0;i < month-1;i ++)//数组是从0开始,但是你的月份从一月份开始,此时最大为month-1为什么不取month-1
{ //你的月份还没过完
rs = rs + a[i] ;
}
rs= rs +day;
return rs;
}
int amont (int year,int month ,int day)//判断到今年为止,你过了多少年
{
int i = 1990;
int sum = 0;
while(i < year)
{
if(leap(i)==1 )
{
sum = sum + 366;
}
else
{
sum = sum + 365;
}
i ++;
}
sum = sum +monthly (year,month,day);
return sum;
}
bool fish_net(int year ,int month ,int day)//判断打鱼还是晒网
{
int b = 0;
b = amont( year,month,day ) % 5;//他是三天打鱼两天晒网,所以就是五天一个轮回
if(b == 0 || b == 4)
{
return 1;
}
else
{
return 0;
}
}
int main ()
{
int y = 1993;
int m =3;
int d =1;
if(y >= 1990)
{
if(fish_net(y,m ,d))
{
printf("晒网\n");
}
else if(fish_net(y,m ,d)==0)
{
printf("打鱼\n");
}
}
else
{
printf("还没开业!\n");
}
return 0;
}
ok,代码结束!