编程笔记 cha2-2 日期类问题
日期差值
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <stdio.h> 5 #define isRein(x) ((x%100!=0)&&(x%4==0)) || (x%400 ==0)?1:0 6 using namespace std; 7 /* 8 题目:日期差值 9 10 */ 11 int dayOfMonth[13][2] = 12 { 13 0,0,// 便于直接从1月开始访问 14 31,31, 15 28,29, 16 31,31, 17 30,30, 18 31,31, 19 30,30, 20 31,31, 21 31,31, 22 30,30, 23 31,31, 24 30,30, 25 31,31 26 }; 27 28 struct Date 29 { 30 int Year; 31 int Month; 32 int Day; 33 void nextDay() 34 { 35 if (++Day > dayOfMonth[Month][isRein(Year)]) 36 { 37 Day = 1; 38 Month ++ ; 39 } 40 if (Month>12) 41 { 42 Month = 1; 43 Year ++; 44 } 45 46 47 } 48 }; 49 int buffer[5000][12][31]; 50 void preProcess() 51 { 52 Date tmp ; 53 tmp.Day = 1; 54 tmp.Month = 1; 55 tmp.Year = 0; 56 int c = 1; 57 while (tmp.Year < 5000) 58 { 59 buffer[tmp.Year][tmp.Month][tmp.Day] = c; 60 c++; 61 tmp.nextDay(); 62 } 63 } 64 int main() 65 { 66 preProcess(); 67 int y1,y2,m1,m2,d1,d2; 68 while ( scanf("%4d%2d%2d",&y1,&m1,&d1)!=EOF ) 69 { 70 scanf("%4d%2d%2d",&y2,&m2,&d2); 71 int ans = abs(buffer[y1][m1][d1]-buffer[y2][m2][d2]); 72 printf("%d ",ans+1); 73 } 74 return 0; 75 }
今年的第几天
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <stdio.h> 5 #define isRein(x) ((x%100!=0)&&(x%4==0)) || (x%400 ==0)?1:0 6 using namespace std; 7 /* 8 题目:今年的第几天 9 思路:减去本年的元旦那一天 10 11 */ 12 int dayOfMonth[13][2] = 13 { 14 0,0,// 便于直接从1月开始访问 15 31,31, 16 28,29, 17 31,31, 18 30,30, 19 31,31, 20 30,30, 21 31,31, 22 31,31, 23 30,30, 24 31,31, 25 30,30, 26 31,31 27 }; 28 29 struct Date 30 { 31 int Year; 32 int Month; 33 int Day; 34 void nextDay() 35 { 36 if (++Day > dayOfMonth[Month][isRein(Year)]) 37 { 38 Day = 1; 39 Month ++ ; 40 } 41 if (Month>12) 42 { 43 Month = 1; 44 Year ++; 45 } 46 47 48 } 49 }; 50 int buffer[5000][12][31]; 51 void preProcess() 52 { 53 Date tmp ; 54 tmp.Day = 1; 55 tmp.Month = 1; 56 tmp.Year = 0; 57 int c = 1; 58 while (tmp.Year < 5000) 59 { 60 buffer[tmp.Year][tmp.Month][tmp.Day] = c; 61 c++; 62 tmp.nextDay(); 63 } 64 } 65 int main() 66 { 67 preProcess(); 68 int y1,d1,m1; 69 while ( scanf("%4d %2d %2d",&y1,&m1,&d1)!=EOF ) 70 { 71 int ans = abs(buffer[y1][m1][d1]-buffer[y1][1][1]); 72 printf("%d ",ans+1); 73 } 74 return 0; 75 }
打印日期
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <stdio.h> 5 #define isRein(x) ((x%100!=0)&&(x%4==0)) || (x%400 ==0)?1:0 6 using namespace std; 7 /* 8 题目:日期差值 9 10 */ 11 int dayOfMonth[13][2] = 12 { 13 0,0,// 便于直接从1月开始访问 14 31,31, 15 28,29, 16 31,31, 17 30,30, 18 31,31, 19 30,30, 20 31,31, 21 31,31, 22 30,30, 23 31,31, 24 30,30, 25 31,31 26 }; 27 28 struct Date 29 { 30 int Year; 31 int Month; 32 int Day; 33 void nextDay() 34 { 35 if (++Day > dayOfMonth[Month][isRein(Year)]) 36 { 37 Day = 1; 38 Month ++ ; 39 } 40 if (Month>12) 41 { 42 Month = 1; 43 Year ++; 44 } 45 46 47 } 48 }; 49 int buffer[5000][12][31]; 50 void preProcess() 51 { 52 Date tmp ; 53 tmp.Day = 1; 54 tmp.Month = 1; 55 tmp.Year = 0; 56 int c = 1; 57 while (tmp.Year < 5000) 58 { 59 buffer[tmp.Year][tmp.Month][tmp.Day] = c; 60 c++; 61 tmp.nextDay(); 62 } 63 } 64 int main() 65 { 66 preProcess(); 67 int y1,num; 68 while ( scanf("%4d %d",&y1,&num)!=EOF ) 69 { 70 int yuandan = buffer[y1][1][1]; 71 int today = yuandan + num -1 ; 72 for (int i = 1 ; i < 13 ;i++) 73 for (int j = 1;j < 32 ; j++) 74 { 75 if (today == buffer[y1][i][j]) 76 printf("%d-%02d-%02d ",y1,i,j); // 控制输出格式,填充0 77 } 78 79 80 } 81 return 0; 82 }
Day ofWeek
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <stdio.h> 5 #define isLeap(x) (x%100 != 0 && x%4 == 0)||(x % 400 == 0)?1:0 6 using namespace std; 7 /* 8 题目:Day ofweek 9 用时: 10 思路:1. 月份和星期日的转换器:利用字符串数组的索引对应字符串 11 2. 已知:今天是星期四 2018 3/8 12 3. 求:今天和求取的那天差了几天,以7位倍数循环 13 4. 这两天谁在前,谁在后,如何通过7来求星期几 14 15 */ 16 17 char tm[13][10] = { 18 "", 19 "January", 20 "February", 21 "March", 22 "April", 23 "May", 24 "June", 25 "July", 26 "August", 27 "September", 28 "October", 29 "November", 30 "December" 31 }; 32 33 char tw[7][10] = { 34 "Sunday", // 0 注意这里Sunday是0 35 "Monday", // 1 36 "Tuesday", 37 "Wednesday", 38 "Thursday", 39 "Friday", 40 "Saturday" 41 }; 42 43 int dayOfMonth[13][2] 44 { 45 0,0, 46 31,31, 47 28,29, 48 31,31, 49 30,30, 50 31,31, 51 30,30, 52 31,31, 53 31,31, 54 30,30, 55 31,31, 56 30,30, 57 31,31 58 }; 59 struct Date 60 { 61 int year; 62 int month; 63 int day; 64 void nextDay() 65 { 66 if (++day > dayOfMonth[month][isLeap(year)]) 67 { 68 day = 1; 69 month++; 70 } 71 if (month > 12 ) 72 { 73 month = 1; 74 year ++; 75 } 76 } 77 }; 78 79 int buffer[3001][13][31]; 80 void preProcessing() 81 { 82 int c = 1; 83 Date date; 84 date.year = 0 ; 85 date.month = 1; 86 date.day = 1; 87 while ( date.year < 3001) 88 { 89 buffer[date.year][date.month][date.day] = c; 90 c++; 91 date.nextDay(); 92 } 93 } 94 int numberMonth (char month[]) 95 { 96 for (int i=1 ;i<13;i++) 97 { 98 if (strcmp(tm[i],month)==0) 99 { 100 return i; 101 } 102 } 103 return 0; 104 } 105 106 int main() 107 { 108 preProcessing(); 109 int day,year; 110 char Month[10]; 111 int today = buffer[2012][7][16]; 112 int month,thatDay; 113 while (scanf("%d %s %d",&day,Month,&year)!=EOF) 114 { 115 month = numberMonth(Month); 116 thatDay = buffer[year][month][day]; 117 // 如何根据差值计算星期几thatDayw? 118 int days = thatDay - today +1; 119 printf("%s ",tw[(days%7+7)%7]); 120 121 122 123 } 124 return 0; 125 }