三天打鱼两天晒网——C语言
题目: 中国有句俗语:“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天是在“打鱼”还是在“晒网”? 思路: 首先求出从1990年1月1日到指定日期之间经过的天数; 经分析,打鱼晒网是5天一轮回,所以用天数对5取余来判断打鱼还是晒网。 具体解释: 观察发现,打鱼晒网是5天一个轮回,前三天打鱼,后两天晒网; 由此可以利用经过的总天数对5取余的方式来判断打鱼还是晒网; 经分析:取余结果为1、2、3时打鱼,结果为0或4时为晒网; 因此需要求出指定的某一天到1990年1月1日期间共有多少天; 对平年闰年分情况讨论,能被4整除但不能被100整除或能被400整除的年份为闰年,有366天,其余为平年,为365天; 求天数时将整年和非整年单独处理:整年直接天数增加366或365;非整年则根据月数以及日期利用循环来求出具体天数; 将平年闰年两种年的每月天数分别存储进数组,用来解决不是整年的剩余天数; 最后根据之前的分析,取余求出结果。 注:还应当对用户输入的日期进行合法判断,例如平年2月没29号、4月没31号等。 代码: #include #include #define YEAR 1990 //宏定义初始年月日 #define MONTH 1 #define DAY 1 /* 三天打鱼两天晒网 题目: 中国有句俗语:“三天打鱼两天晒网”, 某人从1990年1月1日起开始“三天打鱼两天晒网”。 问这个人在以后的某一天是在“打鱼”还是在“晒网”? */ int Input(); //录入数据并判断是否合法 int Days(int,int,int); //求期间的天数,参数为年月日 int Days(int year,int month,int day) { int days = 0; //期间共有多少天 int days_tmp = 0; //不满一年的整月天数 int ping_nian[] = {31,28,31,30,31}; int run_nian[] = {31,29,31}; int i = 0; int j = 0; for(i = YEAR; i <= year; i++) //遍历每一年 { if((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) //判断闰年 { if((year - i) != 0) //判断是否为完整的一年 days += 366; else { for(j = 0; j < month - MONTH; j++) days_tmp += run_nian[j]; days += days_tmp + day; } } else { if((year - i) != 0) //判断是否为完整的一年 days += 365; else { for(j = 0; j < month - MONTH; j++) days_tmp += ping_nian[j]; days += days_tmp + day; } } } return days; } int Input() { int days = 0,//从始至终的总天数 year = 0, month = 0, day = 0; int num = 0; printf("t输入一个1990年包括1月1日之后的日期nn"); printf("输入年月日(逗号隔开):"); while(1) //录入数据并判断是否合法 { scanf("%d,%d,%d",&year,&month,&day); if(year >= YEAR && month >= 1 && month <= 12) //判断年月 { if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12) { if(day >= 1 && day <= 31) //大月天数是否合法 break; else { printf("输入有误,请重新输入:"); fflush(stdin); //清空缓存区 } } else if(month == 2) //2月天数是否合法 { if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) //闰年 { if(day >= 1 && day <= 29) break; else { printf("输入有误,请重新输入:"); fflush(stdin); } } else { if(day >= 1 && day <= 28) break; else { printf("输入有误,请重新输入:"); fflush(stdin); } } } else if(day >= 1 && day <= 30) //小月天数是否合法 break; else { printf("输入有误,请重新输入:"); fflush(stdin); } } else { printf("输入有误,请重新输入:"); fflush(stdin); } } days = Days(year,month,day); //调用求天数的函数 return days; //返回天数 } int main() { int days = 0; //从始至终的总天数 days = Input(); //调用函数 if((days % 5 == 4) || (days % 5 == 0)) //利用取余判断打鱼还是晒网 printf("这一天晒网"); else printf("这一天打鱼"); return 0; } 运行结果: 测试3组数据: 1、1990年1月3日——打鱼; 2、1990年1月4日——晒网; 3、2018年11月11日——打鱼。(先输入非法日期进行数据录入判断测试) ** 程序练习,仅为一种思路,若有错误请指出。 ** (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |