题目描述:中国有句俗话叫“三天打鱼,两天晒网”。某人从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 }