问题描述
如果一个渔夫从2011年1月1日开始每三天打一次渔两天晒一次网,编程实现当输入2011年1月1日以后的任意一天,输出该渔夫是在打渔还是在晒网。
思想解析
首先分析问题我们需要做的事情
- 判断是否为闰年。(即能被4整除又不能被100整除或者能被400整除的是闰年)
- 判断输入的年份距离初始日期有多少天的间隔
- 用求出距离的天数来判断出是在打渔还是在晒网
代码展示
/*如果一个渔夫从2011年1月1日开始每三天打一次渔,两天晒一次网,
编程实现当输入2011年1月1日以后的任意一天,输出的是渔夫的是渔夫是在打鱼还是在晒网。
*/
/*首先分析问题。*/
#include<stdio.h> //引用头文件
//1.首先判断是不是闰年
int Judge(int a)
{
if (a%4==0&&a%100!=0||a%400==0)//闰年判断条件
{
return 0;//如果是闰年就返回0
}
else
{
return 1;//不是闰年就返回1
}
}
//2.计算输入的年份与一开始的天数总共差几天
int number(int year, int month, int day)
{
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};//存放闰年的天数
int k=0;//存放天数
int i,j;//循环变量
if (year==2011)//如果是2011本年就需要计算是该年的第几天
{
for ( i = 0; i < month-1; i++)//因为数组下标是从零开始的所以用month-1,比如2月需要加上1月的天数a【0】
{
k = k + a[0];//因为2011不是闰年所以直接用a[i]数组累加计算
}
k = k + day;//不要忘记加上day的天数
}
else//不是2011年的
{ //首先计算输入年的前一年到2011年有几个整年的天数
for ( j = 2011; j < year; j++)//依次判断之前的年份是闰年还是平年是就加366不是就365
{
if (Judge(j)==0)//是闰年就加366
{
k = k + 366;
}
else//不是闰年就加365
{
k = k + 365;
}
}
//累加计算完整年的天数就计算本年的第几天
if (Judge(year==0))//是闰年就用b[i]累加计算
{
for ( i = 0; i < month-1; i++)
{
k = k + b[i];
}
k = k + day;
}
else//不是闰年就用a[i]累加计算
{
for ( i = 0; i < month-1; i++)
{
k = k + a[i];
}
k = k + day;
}
}
}
//3.main函数引用写的两个函数,if语句判断是在打鱼还是在晒网
int main()
{
int year, month, day, Distance;
printf("请输入年月日");
scanf_s("%d%d%d", &year, &month, &day);
Distance = number(year, month, day);//引用函数判断与初试时间的距离天数。
if (Distance%5==1|| Distance % 5 == 2||Distance % 5 == 3)
{
printf("在%d年%d月%d日,农夫在打渔",year,month,day);
}
else
{
printf("在%d年%d月%d日,农夫在晒网", year, month, day);
}
return 0;
}