打鱼晒网问题

题目描述:中国有句俗话叫“三天打鱼,两天晒网”。某人从1992年1月1日起开始“三天打鱼,两天晒网”,问:这个人在以后的某一天中是“打鱼”还是“晒网”?

解决这个题目分两步:1.距起始日期的天数,2.求余的结果  

代码如下:

 1 #include <stdio.h>
 2 #include <stdlib.h> 
 3 
 4 typedef struct D{
 5     int year;
 6     int month;
 7     int day;
 8 }Date;
 9 
10 int isleapyear(int year){
11     return (year%400==0||year%4==0&&year%100!=0);
12 }
13 
14 int getmaxday(int year,int month){
15     switch(month){
16         case 1:
17         case 3:
18         case 5:
19         case 7:
20         case 8:
21         case 10:
22         case 12:
23             return 31;
24         case 4:
25         case 6:
26         case 9:
27         case 11:
28             return 30;
29         case 2:
30             return isleapyear(year)?29:28;
31         default:
32             return -1;
33     }
34 }
35 
36 int isequal(Date date1,Date date2){
37     if(date1.year==date2.year&&date1.month==date2.month&&date1.day==date2.day){
38         return 1;
39     }
40     return 0;
41 }
42 
43 int getdiffdays(Date date1,Date date2){   //一天一天的算过去,真TM坑啊!!! 
44     int x=0;
45     while(!isequal(date1,date2)){
46         if(date1.day!=getmaxday(date1.year,date1.month)){
47             date1.day++;
48         }
49         else{
50             if(date1.month!=12){
51                 date1.month++;
52                 date1.day=1;
53             }
54             else{
55                 date1.day=date1.month=1;
56                 date1.year++;
57             }
58         }
59         x++;
60     }
61     return x;
62 }
63 
64 int main(){
65     Date date1,date2;
66     int x=0;
67     date1.year=1992;
68     date1.month=1;
69     date1.day=1;
70     printf("请输入日期:"); 
71     scanf("%d%d%d",&date2.year,&date2.month,&date2.day);
72     
73     x=getdiffdays(date1,date2);
74     printf("%d",x);
75     
76     x%=5;
77     if(x==0||x==1)
78         printf("晒网!
");
79     else
80         printf("打鱼!
");
81     system("pause");
82     return 0;
83     
84 } 

根据本题的函数可以解决sicily 1814 日期计算问题       题目描述:给定 2 个日期 yyyy.mm.dd 求两个日期间相差的天数。

代码如下:方法1

  1 #include <iostream>
  2 using namespace std;
  3 
  4 typedef struct D{
  5     int year;
  6     int month;
  7     int day;
  8 }Date;
  9 
 10 int isleapyear(int year){
 11     return (year%400==0||year%4==0&&year%100!=0);
 12 }
 13 
 14 int getmaxday(int year,int month){
 15     switch(month){
 16         case 1:
 17         case 3:
 18         case 5:
 19         case 7:
 20         case 8:
 21         case 10:
 22         case 12:
 23             return 31;
 24         case 4:
 25         case 6:
 26         case 9:
 27         case 11:
 28             return 30;
 29         case 2:
 30             return isleapyear(year)?29:28;
 31         default:
 32             return -1;
 33     }
 34 }
 35 
 36 int isequal(Date date1,Date date2){
 37     if(date1.year==date2.year&&date1.month==date2.month&&date1.day==date2.day){
 38         return 1;
 39     }
 40     return 0;
 41 }
 42 
 43 int getdiffdays(Date date1,Date date2){   //一天一天的算过去,真TM坑啊!!! 
 44     int x=0;
 45     while(!isequal(date1,date2)){
 46         if(date1.day!=getmaxday(date1.year,date1.month)){
 47             date1.day++;
 48         }
 49         else{
 50             if(date1.month!=12){
 51                 date1.month++;
 52                 date1.day=1;
 53             }
 54             else{
 55                 date1.day=date1.month=1;
 56                 date1.year++;
 57             }
 58         }
 59         x++;
 60     }
 61     return x;
 62 }
 63 
 64 bool cmp(Date a,Date b){
 65     if(a.year>b.year){
 66         return 1;
 67     }
 68     else if(a.year==b.year&&a.month>b.month){
 69         return 1;
 70     }
 71     else if(a.year==b.year&&a.month==b.month&&a.day>b.day){
 72         return 1;
 73     }
 74     return 0;
 75 }
 76 
 77 
 78 int main(){
 79     int t;
 80     cin>>t;
 81     while(t--){
 82         char date1[10];
 83         char date2[10];
 84         cin>>date1>>date2;
 85         Date shuju1,shuju2;
 86         int temp1[10],temp2[10];
 87         for(int i=0;i<10;i++){
 88             temp1[i]=date1[i]-'0';
 89             temp2[i]=date2[i]-'0';
 90         }
 91         
 92         shuju1.year = temp1[0]*1000+temp1[1]*100+temp1[2]*10+temp1[3]; 
 93         shuju1.month= temp1[5]*10+temp1[6]; 
 94         shuju1.day  = temp1[8]*10+temp1[9]; 
 95         shuju2.year = temp2[0]*1000+temp2[1]*100+temp2[2]*10+temp2[3]; 
 96         shuju2.month= temp2[5]*10+temp2[6]; 
 97         shuju2.day  = temp2[8]*10+temp2[9];
 98         if(cmp(shuju1,shuju2)){  //这样保证第二个日期大于第一个日期 
 99             Date temp=shuju1;
100             shuju1=shuju2;
101             shuju2=temp;
102         }
103         
104         cout<<getdiffdays(shuju1,shuju2)<<endl; 
105     
106     }    
107     return 0;
108 }
109  

 方法2:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <iostream>
  4 using namespace std;
  5 
  6 typedef struct D{
  7     int year;
  8     int month;
  9     int day;
 10 }Date;
 11 
 12 int isleapyear(int year){
 13     return (year%400==0||year%4==0&&year%100!=0);
 14 }
 15 
 16 int getmaxday(int year,int month){
 17     switch(month){
 18         case 1:
 19         case 3:
 20         case 5:
 21         case 7:
 22         case 8:
 23         case 10:
 24         case 12:
 25             return 31;
 26         case 4:
 27         case 6:
 28         case 9:
 29         case 11:
 30             return 30;
 31         case 2:
 32             return isleapyear(year)?29:28;
 33         default:
 34             return -1;
 35     }
 36 }
 37 
 38 int isequal(Date date1,Date date2){
 39     if(date1.year==date2.year&&date1.month==date2.month&&date1.day==date2.day){
 40         return 1;
 41     }
 42     return 0;
 43 }
 44 
 45 bool cmp(Date a,Date b){
 46     if(a.year>b.year){
 47         return 1;
 48     }
 49     else if(a.year==b.year&&a.month>b.month){
 50         return 1;
 51     }
 52     else if(a.year==b.year&&a.month==b.month&&a.day>b.day){
 53         return 1;
 54     }
 55     return 0;
 56 }
 57 
 58 int getdays(Date date1,Date date2){
 59     int days=0;
 60     if(cmp(date1,date2)){  //这样保证第二个日期不小于第一个日期 
 61             Date temp=date1;
 62             date1=date2;
 63             date2=temp;
 64     }
 65     
 66     if(isequal(date1,date2)){
 67         return 0;
 68     }
 69     else{
 70         if(date1.year<date2.year){
 71             //这里是两头计算的事情 
 72             for(int i=date1.month+1;i<=12;i++){
 73                 days+=getmaxday(date1.year,i); 
 74             } 
 75             days+=getmaxday(date1.year,date1.month)-date1.day;
 76             
 77             for(int i=date1.year+1;i<date2.year;i++){
 78                 if(isleapyear(i)){
 79                     days+=366;
 80                 }
 81                 else{
 82                     days+=365;
 83                 }
 84             }
 85             
 86             for(int i=1;i<=date2.month-1;i++){
 87                 days+=getmaxday(date2.year,i);
 88             }
 89             days+=date2.day;
 90             return days; 
 91         }
 92         else{  //date1.year==date2.year   
 93             if( date1.month==date2.month){
 94                 days=date2.day-date1.day;
 95                 return days;
 96             }
 97             else{
 98                 int start_maxday=getmaxday(date1.year,date1.month);
 99                 days=start_maxday-date1.day;
100                 if(date2.month=date1.month+1){
101                     days+=date2.day;
102                     return days;
103                 }
104                 else{
105                     int m=date2.month,n=date1.month+1;
106                     if(n!=m){ 
107                         days+=getmaxday(date1.year,n);
108                         n++;
109                     }
110                     days+=date2.day;
111                     return days;
112                 }
113             }    
114         }        
115     }
116     
117 }
118  
119 int main(){
120     int t;
121     cin>>t;
122     while(t--){
123         char date1[10];
124         char date2[10];
125         cin>>date1>>date2;
126         Date shuju1,shuju2;
127         int temp1[10],temp2[10];
128         for(int i=0;i<10;i++){
129             temp1[i]=date1[i]-'0';
130             temp2[i]=date2[i]-'0';
131         }
132         
133         shuju1.year = temp1[0]*1000+temp1[1]*100+temp1[2]*10+temp1[3]; 
134         shuju1.month= temp1[5]*10+temp1[6]; 
135         shuju1.day  = temp1[8]*10+temp1[9]; 
136         shuju2.year = temp2[0]*1000+temp2[1]*100+temp2[2]*10+temp2[3]; 
137         shuju2.month= temp2[5]*10+temp2[6]; 
138         shuju2.day  = temp2[8]*10+temp2[9];
139        
140         cout<<getdays(shuju1,shuju2)<<endl; 
141     }    
142     return 0;
143 }
原文地址:https://www.cnblogs.com/liugl7/p/4816119.html