三天打鱼两天晒网

一、问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的以后的某一天中是打鱼还是晒网。
输入要求:年份.月份.日期(已知正确吧)。
输出要求:“打鱼” 或者“晒网”。

二、思路分析
打鱼晒网的周期为5天,只要将距离1990.1.1的天数%5,为123则是打鱼,45为晒网。所以本题主要就是求所给日期到1990.1.1有多少天,其中要注意闰年和平年。

三、代码模块实现
1.判断闰年
闰年定义:能被4整除但不能被100整除 或者能被400整除 所以代码:
if(y%4==0&&y%100!=0||y%400==0)//这里注意&&的优先级比||高所以不加()也行 但是建议在条件多时加上()避免不必要的错误
2.不同月份的时间
int p[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//建立平年各月份天数的数组
int r[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//建立闰年各月份天数的数组
3.计算相距日期
for(i=1990;i<y;i++)//年 注意这里不可以去等号 举个例子1990.1.2 就过了两天去 加上等号会加365
判断是否闰年 是+366 不是+365
for(i=1;i<m;i++)//月 这里同上
判断闰年是用数组r 不是用p
日期直接加day 1.1就是第一天所以day是几就加几 不用减

四、具体代码实现
`#include<stdio.h>
int main()
{
int y,m,day;//年月日
scanf("%d.%d.%d",&y,&m,&day);//输入

int p[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//建立平年各月份天数的数组
int r[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//建立闰年各月份天数的数组 

int i,sum=0;
for(i=1990;i<y;i++) //年 
{
	if(y%4==0&&y%100!=0||y%400==0)
	sum+=366;
	else sum+=365;
}

for(i=1;i<m;i++)  //月 
{
	if(y%4==0&&y%100!=0||y%400==0)
	sum+=r[i];
	else sum+=p[i];
}

sum+=day;//日 
//输出 
if(sum%5==4||sum%5==0)
printf("晒网");
else printf("打鱼"); 

return 0;

} `

五、总结
1.要注意闰年
2.要在去等号处特殊考虑,可以举例帮助判断

posted @ 2023-04-17 20:02  努力才是最终入场券  阅读(213)  评论(0)    收藏  举报