fork(1) download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int ymdToWeekNumber (int y, int m, int d) {
  5. // reject out-of-range input
  6. if ((y < 1965)||(y > 2099)) return 0;
  7. if ((m < 1)||(m > 12)) return 0;
  8. if ((d < 1)||(d > 31)) return 0;
  9. // compute correction for year
  10. // If Jan. 1 falls on: Mo Tu We Th Fr Sa Su
  11. // then the correction is: 0 +1 +2 +3 -3 -2 -1
  12. int corr = ((((y - 1965) * 5) / 4) % 7) - 3;
  13. // compute day of the year (in range 1-366)
  14. int doy = d;
  15. if (m > 1) doy += 31;
  16. if (m > 2) doy += (((y%4)==0) ? 29 : 28);
  17. if (m > 3) doy += 31;
  18. if (m > 4) doy += 30;
  19. if (m > 5) doy += 31;
  20. if (m > 6) doy += 30;
  21. if (m > 7) doy += 31;
  22. if (m > 8) doy += 31;
  23. if (m > 9) doy += 30;
  24. if (m > 10) doy += 31;
  25. if (m > 11) doy += 30;
  26. // compute corrected day number
  27. int cdn = corr + doy;
  28. // check for boundary conditions
  29. // if our calculation would give us "week 53",
  30. // we need to find out whether week 53 really exists,
  31. // or whether it is week 1 of the following year
  32. if (cdn > 364) {
  33. // check for year beginning on Thurs.
  34. if (corr==3) return 53;
  35. // check for leap year beginning on Wed.
  36. if (((y%4)==0) && (corr==2)) return 53;
  37. // otherwise, there is no week 53
  38. return 1;
  39. }
  40. // if our calculation would give us "week 0",
  41. // then go to the previous year
  42. // and find out whether we are in week 52 or week 53
  43. if (cdn < 1) {
  44. // first, compute correction for the previous year
  45. corr = ((((y - 1966) * 5) / 4) % 7) - 3;
  46. // then, compute day of year with respect to that same previous year
  47. doy = d + (((y%4)==1)?366:365);
  48. // finally, re-compute the corrected day number
  49. cdn = corr + doy;
  50. }
  51. // compute number of weeks, rounding up to nearest whole week
  52. return ((cdn + 6) / 7);
  53. }
  54.  
  55. int main() {
  56. cout << "Week number test\n";
  57. int y, m, d;
  58. srand(16028);
  59. for (int i=2020; i<=2050; i++) {
  60. y=i;
  61. m=1;
  62. d=1;
  63. cout << y << "/" << m << "/" << d << " ";
  64. cout << ymdToWeekNumber(y,m,d) << "\n";
  65. m=1+(rand()%3);
  66. d=2+(rand()%27);
  67. cout << y << "/" << m << "/" << d << " ";
  68. cout << ymdToWeekNumber(y,m,d) << "\n";
  69. m=4+(rand()%3);
  70. d=1+(rand()%30);
  71. cout << y << "/" << m << "/" << d << " ";
  72. cout << ymdToWeekNumber(y,m,d) << "\n";
  73. m=7+(rand()%3);
  74. d=1+(rand()%30);
  75. cout << y << "/" << m << "/" << d << " ";
  76. cout << ymdToWeekNumber(y,m,d) << "\n";
  77. m=10+(rand()%3);
  78. d=1+(rand()%30);
  79. cout << y << "/" << m << "/" << d << " ";
  80. cout << ymdToWeekNumber(y,m,d) << "\n";
  81. m=12;
  82. d=31;
  83. cout << y << "/" << m << "/" << d << " ";
  84. cout << ymdToWeekNumber(y,m,d) << "\n";
  85. }
  86. return 0;
  87. }
Success #stdin #stdout 0.01s 5472KB
stdin
Standard input is empty
stdout
Week number test
2020/1/1  1
2020/2/28  9
2020/4/22  17
2020/9/10  37
2020/12/19  51
2020/12/31  53
2021/1/1  53
2021/1/27  4
2021/5/26  21
2021/9/6  36
2021/10/20  42
2021/12/31  52
2022/1/1  52
2022/1/4  1
2022/4/1  13
2022/9/8  36
2022/12/29  52
2022/12/31  52
2023/1/1  52
2023/3/2  9
2023/4/1  13
2023/8/20  33
2023/12/21  51
2023/12/31  52
2024/1/1  1
2024/2/11  6
2024/4/25  17
2024/9/25  39
2024/11/15  46
2024/12/31  1
2025/1/1  1
2025/2/8  6
2025/5/19  21
2025/7/5  27
2025/12/25  52
2025/12/31  1
2026/1/1  1
2026/1/23  4
2026/5/10  19
2026/9/28  40
2026/12/21  52
2026/12/31  53
2027/1/1  53
2027/2/23  8
2027/5/7  18
2027/9/7  36
2027/10/16  41
2027/12/31  52
2028/1/1  52
2028/3/14  11
2028/6/20  25
2028/7/8  27
2028/11/6  45
2028/12/31  52
2029/1/1  1
2029/2/25  8
2029/5/24  21
2029/9/16  37
2029/12/25  52
2029/12/31  1
2030/1/1  1
2030/2/12  7
2030/5/19  20
2030/9/4  36
2030/10/29  44
2030/12/31  1
2031/1/1  1
2031/2/18  8
2031/5/13  20
2031/7/24  30
2031/12/21  51
2031/12/31  1
2032/1/1  1
2032/1/7  2
2032/5/3  19
2032/7/27  31
2032/11/30  49
2032/12/31  53
2033/1/1  53
2033/3/28  13
2033/5/8  18
2033/7/3  26
2033/12/15  50
2033/12/31  52
2034/1/1  52
2034/2/21  8
2034/4/1  13
2034/9/25  39
2034/10/8  40
2034/12/31  52
2035/1/1  1
2035/1/15  3
2035/6/13  24
2035/8/24  34
2035/10/19  42
2035/12/31  1
2036/1/1  1
2036/2/21  8
2036/4/29  18
2036/8/20  34
2036/11/28  48
2036/12/31  1
2037/1/1  1
2037/3/5  10
2037/4/7  15
2037/7/22  30
2037/12/6  49
2037/12/31  53
2038/1/1  53
2038/2/28  8
2038/4/5  14
2038/9/19  37
2038/12/9  49
2038/12/31  52
2039/1/1  52
2039/1/20  3
2039/4/9  14
2039/9/29  39
2039/12/17  50
2039/12/31  52
2040/1/1  52
2040/3/19  12
2040/4/29  17
2040/9/27  39
2040/10/26  43
2040/12/31  1
2041/1/1  1
2041/1/11  2
2041/5/8  19
2041/7/14  28
2041/11/18  47
2041/12/31  1
2042/1/1  1
2042/1/25  4
2042/4/28  18
2042/7/26  30
2042/11/19  47
2042/12/31  1
2043/1/1  1
2043/2/3  6
2043/4/11  15
2043/7/16  29
2043/10/25  43
2043/12/31  53
2044/1/1  53
2044/2/24  8
2044/4/7  14
2044/7/4  27
2044/12/23  51
2044/12/31  52
2045/1/1  52
2045/2/17  7
2045/5/17  20
2045/8/27  34
2045/11/27  48
2045/12/31  52
2046/1/1  1
2046/2/12  7
2046/6/4  23
2046/9/22  38
2046/10/14  41
2046/12/31  1
2047/1/1  1
2047/3/18  12
2047/5/4  18
2047/7/5  27
2047/10/5  40
2047/12/31  1
2048/1/1  1
2048/3/18  12
2048/6/14  24
2048/8/26  35
2048/10/18  42
2048/12/31  53
2049/1/1  53
2049/3/9  10
2049/5/11  19
2049/8/21  33
2049/10/7  40
2049/12/31  52
2050/1/1  52
2050/3/28  13
2050/4/3  13
2050/8/24  34
2050/11/8  45
2050/12/31  52