题目:
中国有句俗语:“三天打鱼两天晒网”,某人从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日——打鱼。(先输入非法日期进行数据录入判断测试)
**
程序练习,仅为一种思路,若有错误请指出。
**
总结以上是内存溢出为你收集整理的三天打鱼两天晒网——C语言全部内容,希望文章能够帮你解决三天打鱼两天晒网——C语言所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)