fork(1) download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int days_in_month (int y, int m) {
  5. // Fourth, eleventh, ninth, and sixth,
  6. // thirty days to each we fix.
  7. if ((m==4)||(m==11)||(m==9)||(m==6)) return 30;
  8. // Every other, thirty-one,
  9. // except the second month alone,
  10. if (m!=2) return 31;
  11. // which hath twenty-eight, in fine,
  12. // till leap-year give it twenty-nine.
  13. if ((y%400)==0) return 29; // leap year
  14. if ((y%100)==0) return 28; // not a leap year
  15. if ((y%4)==0) return 29; // leap year
  16. return 28; // not a leap year
  17. }
  18.  
  19. int ymdToWeekNumber (int y, int m, int d) {
  20. // reject out-of-range dates
  21. if ((y < 1901)||(y > 2099)) return 0;
  22. if ((m < 1)||(m > 12)) return 0;
  23. if ((d < 1)||(d > 31)) return 0;
  24. // (It is useful to know that Jan. 1, 1901 was a Tuesday)
  25. // compute adjustment for dates within the year
  26. // If Jan. 1 falls on: Mo Tu We Th Fr Sa Su
  27. // then the adjustment is: 6 7 8 9 3 4 5
  28. int adj = (((y-1901) + ((y-1901)/4) + 4) % 7) + 3;
  29. // compute day of the year (in range 1-366)
  30. int doy = d;
  31. if (m > 1) doy += 31;
  32. if (m > 2) {
  33. if ((y%4)==0) doy += 29;
  34. else doy += 28;
  35. }
  36. if (m > 3) doy += 31;
  37. if (m > 4) doy += 30;
  38. if (m > 5) doy += 31;
  39. if (m > 6) doy += 30;
  40. if (m > 7) doy += 31;
  41. if (m > 8) doy += 31;
  42. if (m > 9) doy += 30;
  43. if (m > 10) doy += 31;
  44. if (m > 11) doy += 30;
  45. // compute week number
  46. int wknum = (adj + doy) / 7;
  47. // check for boundary conditions
  48. if (wknum < 1) {
  49. // last week of the previous year
  50. // check to see whether that year had 52 or 53 weeks
  51. // re-compute adjustment, this time for previous year
  52. adj = (((y-1902) + ((y-1902)/4) + 4) % 7) + 3;
  53. // all years beginning on Thursday have 53 weeks
  54. if (adj==9) return 53;
  55. // leap years beginning on Wednesday have 53 weeks
  56. if ((adj==8) && ((y%4)==1)) return 53;
  57. // other years have 52 weeks
  58. return 52;
  59. }
  60. if (wknum > 52) {
  61. // check to see whether week 53 exists in this year
  62. // all years beginning on Thursday have 53 weeks
  63. if (adj==9) return 53;
  64. // leap years beginning on Wednesday have 53 weeks
  65. if ((adj==8) && ((y%4)==0)) return 53;
  66. // other years have 52 weeks
  67. return 1;
  68. }
  69. return wknum;
  70. }
  71.  
  72. int main() {
  73. int errcnt = 0;
  74. int yyyy=1901, mo=1, dd=1, wd=2, wn=1;
  75. cout << "Simple week number test\n";
  76. while (yyyy<2100) {
  77. int wntest = ymdToWeekNumber(yyyy,mo,dd);
  78. if (wn != wntest) {
  79. errcnt++;
  80. if (errcnt <= 50) {
  81. cout << yyyy << "/" << mo << "/" << dd << " " << wn << " " << wntest << "\n";
  82. }
  83. }
  84. dd++;
  85. if (dd > days_in_month(yyyy,mo)) {
  86. dd = 1;
  87. mo++;
  88. if (mo > 12) {
  89. mo = 1;
  90. yyyy++;
  91. }
  92. }
  93. wd++;
  94. if (wd > 7) {
  95. wd = 1;
  96. wn++;
  97. if (((mo==12) && (dd>=29)) || ((mo==1) && (dd<=4))) wn = 1;
  98. }
  99. }
  100. cout << "Error count: " << errcnt << "\n";
  101. return 0;
  102. }
Success #stdin #stdout 0.01s 5516KB
stdin
Standard input is empty
stdout
Simple week number test
Error count: 0