三天打鱼两天晒网

 

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

*问题分析与算法设计
根据题意可以将解题过程分为三步:
1)计算从1990年1月1日开始至指定日期共有多少天
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除
3)根据余数判断他是在“打鱼”还是在“晒网”
若余数为1,2,3,则他是在“打鱼”
否则 是在“晒网”
在这三步中,关键是第一步。求从1990年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。
闰年的方法可以用伪语句描述如下:
如果 ((年能被4除尽 且 不能被100除尽)或 能被400除尽) 则该年是闰年;
否则 不是闰年。


C语言中判断能否整除可以使用求余运算(即求模)

  1. #include <stdio.h>   
  2.   
  3. struct date  
  4. {  
  5.     int year;  
  6.     int month;  
  7.     int day;  
  8. };  
  9.   
  10. int days(struct date day);  
  11.   
  12. int main(void)  
  13. {  
  14.     struct date today,term;  
  15.     int yearday, year, day;  
  16.     printf("Enter year/month/day");  
  17.     scanf("%d%d%d", &today.year,&today.month,&today.day);  
  18.     term.month=12;  
  19.     term.day=31;  
  20.   
  21.     for(yearday=0,year=1990; year<today.year; year++)  
  22.     {  
  23.         term.year = year;  
  24.         yearday +=  days(term);  
  25.     }  
  26.   
  27.     yearday += days(today);  
  28.     day      = yearday%5;  
  29.   
  30.     if(day>0 && day<4)  
  31.         printf("he was fishing at that day/n");  
  32.     else  
  33.         printf("he was sleeping at that day./n");  
  34. }  
  35.   
  36. int days(struct date day)  
  37. {  
  38.     static int day_tab[2][13]=  
  39.     {  
  40.         {0,31,28,31,30,31,30,31,31,30,31,30,31,},  
  41.         {0,31,29,31,30,31,30,31,31,30,31,30,31,},  
  42.     };  
  43.   
  44.     int i,lp;  
  45.     lp =  ((day.year%4 == 0) && (day.year%100!= 0))||(day.year%400==0);  
  46.   
  47.     for(i=1;i<day.month; ++i){  
  48.         day.day += day_tab[lp][i];  
  49.     }  
  50.   
  51.     return day.day;  

#include "stdio.h"
#define YEAR 2000
#define DAYS 365

int TotalDays(int year,int month,int day);
int a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

int main()
{
    int totalday;
    int year,month,day;
    printf("please input the yaer-month-day:");
    scanf("%d-%d-%d",&year,&month,&day);

    totalday = TotalDays(year,month,day);
    printf("%d-%d-%d 是:",year,month,day);
    if (totalday % 5 == 0 || totalday % 5 == 4)
    {
        printf("晒网日!\n");
    }
    else
    {
        printf("打鱼日!\n");
    }

    return 0;
}

//统计当前的天数
int TotalDays(int year,int month,int day)
{
    int i = year - YEAR;
    int i_month = 1;
    int totalday = day;
    if ( year%4 == 0 && year%100 != 0)
    {
        a[2] = 29;
    }

   
   
    if ( i > 0 )
    {
        totalday += DAYS*i + (i-1)/4 + 1;
    };
 while (i_month < month)
    {
        totalday += a[i_month ++];
    }
 
    return totalday;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值