C语言实现 三天打鱼两天晒网 MOOC习题

//

题目内容:中国有句俗语:“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天是在“打鱼”还是在“晒网”?

输入样例:1990-1-3

输出样例:他在打鱼

输入样例:2018-11-13

输出样例:他在晒网

大致的思路是:

  • 计算从 1990年 1月 1日开始至指定日期共有多少天
  • 由于“打鱼”和“晒网”的周期为 5天,所以将计算出的天数用 5去取模(也就是取余)
  • 根据余数判断他是在“打鱼”还是在“晒网”;若余数为 1,2,3,则他是在“打鱼” 如果余数是4,5是在“晒网”。

需要注意的是:求从 1990年 1月 1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为 29天,平年为 28天。

接下来是代码的实现

#include

//判断闰年的函数,如果返回1是闰年,返回0不是闰年 
int isLeapYear(int year){
	if((!(year%4)&&(year%100))||!(year%400))
		return 1;
	else
		return 0;
}
int main(){
	//year表示输入的年,month表示月,day表示日,numOfDays表示距离1990-1-1的天数 
	int year,month,day,numOfDays=0;
	
	//a数组为非闰年每月的天数 
	//b数组为闰年每月的天数 
	int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};
	scanf("%d-%d-%d",&year,&month,&day); 	//输入数据 
 	
	/*
	1.计算天数
	*/ 
	int beginYear,beginMonth;
	for(beginYear=1990;beginYear<year;beginYear++){//加年 
		if(isLeapYear(beginYear))
			numOfDays+=366;
		else
			numOfDays+=365;
	} 
	//注意开始的月份为0 
	for(beginMonth=0;beginMonth<(month-1);beginMonth++) {//加月
		if(isLeapYear(year)){//判断输入的年份是否为闰年,进而确定二月数值 
			numOfDays+=b[beginMonth];
		}else{
			numOfDays+=a[beginMonth];
		}
	
	} 
	numOfDays+=day; 	//加天 

	/*
	2.天数%5取模判断 
	*/ 
	int flag=numOfDays%5; 
	if(!(flag-1)||!(flag-2)||!(flag-3))
		printf("他在打鱼");
	else
		printf("他在晒网");
	return 0;
}

如果出现样例测试的错误,请留言

你可能感兴趣的:(C/C++程序)