fork(2) 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 ymdToWeekNumberA (int y, int m, int d) {
  20. // reject out-of-range input
  21. if ((y < 1583)||(y > 25000)) return 0;
  22. if ((m < 1)||(m > 12)) return 0;
  23. if ((d < 1)||(d > 31)) return 0;
  24. // compute correction for year
  25. // If Jan. 1 falls on: Mo Tu We Th Fr Sa Su
  26. // then the correction is: 0 +1 +2 +3 -3 -2 -1
  27. int corr = ((y + 2 + (y-1)/4 - (y-1)/100 + (y-1)/400) % 7) - 3;
  28. // compute day of the year (in range 1-366)
  29. int doy = d;
  30. if (m > 1) doy += 31;
  31. if (m > 2) doy += (((y%100) ? (y%4) : (y%400)) ? 28 : 29);
  32. if (m > 3) doy += 31;
  33. if (m > 4) doy += 30;
  34. if (m > 5) doy += 31;
  35. if (m > 6) doy += 30;
  36. if (m > 7) doy += 31;
  37. if (m > 8) doy += 31;
  38. if (m > 9) doy += 30;
  39. if (m > 10) doy += 31;
  40. if (m > 11) doy += 30;
  41. // compute corrected day number
  42. int cdn = corr + doy;
  43. // compute number of weeks, rounding up to nearest whole week
  44. // this gives us our week number
  45. int wknum = ((cdn + 6) / 7);
  46. // check for boundary conditions:
  47. // if our calculation would give us "week 0",
  48. // then it is really the final week of the previous year
  49. // and we need to find out whether that is week 52 or week 53
  50. if (wknum < 1) {
  51. // first, compute correction for the previous year
  52. corr = ((y + 1 + (y-2)/4 - (y-2)/100 + (y-2)/400) % 7) - 3;
  53. // then, compute day of year with respect to that same previous year
  54. doy = d + ((((y-1)%100) ? ((y-1)%4) : ((y-1)%400)) ? 365 : 366);
  55. // finally, re-compute the corrected day number and the week number
  56. cdn = corr + doy;
  57. wknum = ((cdn + 6) / 7);
  58. return wknum;
  59. }
  60. // if our calculation would give us "week 53",
  61. // we need to find out whether week 53 really exists,
  62. // or whether it is week 1 of the following year
  63. if (wknum > 52) {
  64. // check for year beginning on Thurs.
  65. if (corr==3) return 53;
  66. // check for leap year beginning on Wed.
  67. if ((((y%100)?(y%4):(y%400))==0) && (corr==2)) return 53;
  68. // otherwise, there is no week 53
  69. return 1;
  70. }
  71. return wknum;
  72. }
  73.  
  74. int ymdToWeekNumberB (int y, int m, int d) {
  75. if ((y < 1583)||(y > 25000)) return 0;
  76. if ((m < 1)||(m > 12)) return 0;
  77. if ((d < 1)||(d > 31)) return 0;
  78. int adj = ((y + 2 + (y-1)/4 - (y-1)/100 + (y-1)/400) % 7) + 3;
  79. int doy = d;
  80. for (int i=1; i<m; i++) doy += (30 + ((0x15AA >> i) & 1));
  81. if (m > 2) doy -= (((y%100) ? (y%4) : (y%400)) ? 2 : 1);
  82. int wknum = (adj + doy) / 7;
  83. if (wknum < 1) {
  84. adj = ((y + 1 + (y-2)/4 - (y-2)/100 + (y-2)/400) % 7) + 3;
  85. if (adj==9) return 53;
  86. if ((adj==8) && ((((y-1)%100)?(y%4):(y%400))==1)) return 53;
  87. return 52;
  88. }
  89. if (wknum > 52) {
  90. if (adj==9) return 53;
  91. if ((adj==8) && (((y%100)?(y%4):(y%400))==0)) return 53;
  92. return 1;
  93. }
  94. return wknum;
  95. }
  96.  
  97. int main() {
  98. int yyyy=1583, mo=1, dd=3, wd=1, wn=1;
  99. int wna, wnb;
  100. int errcnta=0, errcntb=0;
  101. while (yyyy<=25000) {
  102. wna=ymdToWeekNumberA(yyyy,mo,dd);
  103. wnb=ymdToWeekNumberB(yyyy,mo,dd);
  104. if ((wn!=wna)||(wn!=wnb)) {
  105. if ((errcnta<100)&&(errcntb<100)) {
  106. cout << yyyy << "/" << mo << "/" << dd << " ";
  107. cout << "W" << wn << "-" << wd << " ";
  108. cout << "A=" << wna << " B=" << wnb << "\n";
  109. }
  110. if (wn!=wna) errcnta++;
  111. if (wn!=wnb) errcntb++;
  112. }
  113. dd++;
  114. if (dd>days_in_month(yyyy,mo)) {
  115. dd=1;
  116. mo++;
  117. if (mo>12) {
  118. mo=1;
  119. yyyy++;
  120. }
  121. }
  122. wd++;
  123. if (wd>7) {
  124. wd=1;
  125. wn++;
  126. if (((mo==12)&&(dd>=29))||((mo==1)&&(dd<=4))) wn=1;
  127. }
  128. }
  129. cout << "Errors (A): " << errcnta << "\n";
  130. cout << "Errors (B): " << errcntb << "\n";
  131. // your code goes here
  132. return 0;
  133. }
Success #stdin #stdout 0.29s 5420KB
stdin
Standard input is empty
stdout
Errors (A): 0
Errors (B): 0