zoukankan      html  css  js  c++  java
  • 打鱼晒网问题

    题目描述:中国有句俗话叫“三天打鱼,两天晒网”。某人从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 }
  • 相关阅读:
    Ajax的个人总结
    JSON和计算机网络的个人总结
    Bootstrap内辅助类,响应式工具,组件的个人总结
    Bootstrap内栅格布局,表格,按钮,图片的个人总结
    [BUG] Linux font family error #153
    WPF在WindowStyle=None时去掉顶部白条
    WPF 之 左键弹出操作菜单,并禁用右键菜单
    WPF 气泡提示框的简单实现
    WPF TextBox 如何简单粗暴的实现水印效果?
    c#笔记--WPF文本框和密码框添加水印效果(背景文字提示)
  • 原文地址:https://www.cnblogs.com/liugl7/p/4816119.html
Copyright © 2011-2022 走看看