三天打鱼 两天晒网 问题



中国有句俗语叫“三天打鱼两天晒网”。某人从201011日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用CC++语言实现程序解决问题。

思路提示:

  根据题意可以将解题过程分为三步:

1)计算从201011日开始至指定日期共有多少天;

2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;

3)根据余数判断他是在“打鱼”还是在“晒网”;

    余数为123,则他是在“打鱼”, 否则  是在“晒网”

在这三步中,关键是第一步。求从199011日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:

        如果   ((年能被4除尽 且 不能被100除尽)或 能被400除尽)

              该年是闰年;

        否则    不是闰年。

/*********三天打鱼两天晒网问题***********

//版本:v1.0

//创建时间:2017310

//主要功能:判断某人在输入日期那天是打鱼还是晒网

//************************************

 

#include <stdio.h>

void main()

{

 

   int e;

   printf("1.查询 2.退出\n");

   scanf("%d",&e);

   while(e==1)//循环

   {

   inty,m,d;//定义变量

   int Total(int y,int m,int d);//函数声明

   printf("请输入你要查询的年月日(2010 1 1)");

   scanf("%d%d%d",&y,&m,&d);//输入查询的年月日

   int judge(inty,int m,int d);

   if(judge(y,m,d)==1)

   {

 

  int x=(Total( y, m, d)%5);//x为总天数除以五取余

 

   if(x<=3&&x>=1)//如果余数为1,2,3,则该天为打鱼,否则,该天为晒网

       printf("%d%d%d日是打鱼\n",y,m,d);

   else

       printf("%d%d%d日是晒网\n",y,m,d);

   printf("1.继续 2.退出\n");

   scanf("%d",&e);

   }

   else

       printf("请检查并输入正确的日期\n");

   } 

}

//求输入日期到201011日的总天数

int Total( int y,int m,int d)  

{

   inti,j,l,g,s;

   l=0;

   g=0;

   int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年每月天数

   for(i=2010;i<y;i++)

   {

       if((i%4==0&&i%100!=0)||i%400==0)//判断是否为闰年

        l=l+366;

       else

        l=l+365;        

   }//输入年份距2010年之间的总天数

   

   for(j=0;j<m;j++)

   {

       if(((y%4==0&&y%100!=0)||y%400==0)&&m>2)//判断是否为闰年

          g=g+a[j]+1;

       else

          g=g+a[j];                              

   }//输入月份距输入年份第一天的总天数

   s=l+g+d;//总天数

   return (s);

 

}

//判断输入日期的正确性

int judge(int y,int m,int d)

{

 

   if(y>=2010)//年份输入正确判断

   {

       if(((y%4==0&&y%100!=0)||y%400==0)&&m>2)//判断是否为闰年

       {

           if(m>0&&m<=12)//判断输入月份是否正确

           {

               if(m==2)//如果为闰年,判断是否为2月份

               {

                  if(d>0&&d<=29)//2月份有29

                    return 1;

                  else

                    return 0;

               }

               else

               {

                   if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)//闰年1,3,5,7,8,10,12月份为31

                   {

                       if(d<=31&&d>0)

                           return1;

                       else

                           return0;

                   }

                   else

                   {

                       if(d<=30&&d>0)//其余月份为30

                           return1;

                       else

                           return0;

                  }

               }

           }

           else

               return0;

       }

       else

       {

           if(m>0&&m<=12)

           {

               if(m==2)

               {

                if(d>0&&d<=28)//平年2月份有28

                    return 1;

                else

                    return 0;

               }

               else

               {

                   if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)//平年1,3,5,7,8,10,12月有31

                   {

                       if(d>0&&d<=31)

                           return1;

                       else

                           return0;

                   }

                   else

                   {

                       if(d<=30&&d>0)//平年其他月份为30

                           return1;

                       else

                           return0;

                   }

               }

           }

           else

              return 0;

       }

   }

   else

       return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值