fork(6) download
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <string>
  5. #include <sstream>
  6.  
  7. using namespace std;
  8.  
  9. int PozycjaPytajnika(string Pesel)
  10. {
  11. for(int i = 0; i < Pesel.length(); i++)
  12. {
  13. if(Pesel[i] == '?')
  14. return i;
  15. }
  16. }
  17.  
  18. int oblicz_pesel(string pesel, int pozycja_pytajnika)
  19. {
  20. pesel[pozycja_pytajnika] = pesel[pozycja_pytajnika] - '?' + '0';
  21. int wynik = (pesel[0] - 48)*1 + (pesel[1] - 48)*3 +(pesel[2] - 48)*7 + (pesel[3] - 48)*9 + (pesel[4] - 48)*1 + (pesel[5] - 48)*3
  22. + (pesel[6] - 48)*7 + (pesel[7] - 48)*9 + (pesel[8] - 48)*1 + (pesel[9] - 48)*3 + (pesel[10] - 48)*1;
  23. return wynik;
  24. }
  25.  
  26. int WagaDoPozycji(int pozycja)
  27. {
  28. switch (pozycja)
  29. {
  30. case 0: return 1;
  31. case 1: return 3;
  32. case 2: return 7;
  33. case 3: return 9;
  34. case 4: return 1;
  35. case 5: return 3;
  36. case 6: return 7;
  37. case 7: return 9;
  38. case 8: return 1;
  39. case 9: return 3;
  40. case 10: return 1;
  41. default:
  42. break;
  43. }
  44. }
  45.  
  46. //tablica z liczba dni od początku roku (nieprzestepnego) dla kolejnych miesiecy
  47. int liczbaDni[] =
  48. {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  49.  
  50. //1 jezeli podany rok jest przestepny,
  51. //0 w przeciwnym wypadku
  52. int przestepny(int rok)
  53. {
  54. return ((rok % 4 == 0 && rok % 100 != 0) || rok % 400 == 0);
  55. }
  56.  
  57. //dla podanej daty wyznacza dzien tygodnia
  58. //1 - poniedziałek, 2 - wtorek, ... 7 - niedziela
  59. int dzienTygodnia(int dzien, int miesiac, int rok)
  60. {
  61. int dzienRoku;
  62. int yy, c, g;
  63. int wynik;
  64.  
  65. dzienRoku = dzien + liczbaDni[miesiac-1];
  66. if ((miesiac > 2) && (przestepny(rok) == 1))
  67. dzienRoku++;
  68.  
  69. yy = (rok - 1) % 100;
  70. c = (rok - 1) - yy;
  71. g = yy + (yy / 4);
  72. wynik = (((((c / 100) % 4) * 5) + g) % 7);
  73. wynik += dzienRoku - 1;
  74. wynik %= 7;
  75.  
  76. return wynik+1;
  77. }
  78.  
  79. int main()
  80. {
  81. ios::sync_with_stdio(0);
  82.  
  83. string kodKierownika, pesel;
  84. int ile_peseli,wynik;
  85.  
  86. bool plec,dzienB,rokB;
  87. plec = dzienB = rokB = true;
  88. wynik = 0;
  89.  
  90. cin >> kodKierownika >> ile_peseli;
  91.  
  92. for(int i = 0; i < ile_peseli; i++)
  93. {
  94. cin >> pesel;
  95.  
  96. if( pesel[9] == '?' ||
  97. pesel[0] == '?' ||
  98. pesel[1] == '?' ||
  99. pesel[2] == '?' ||
  100. pesel[3] == '?' ||
  101. pesel[4] == '?' ||
  102. pesel[5] == '?' )
  103. {
  104. int pozycja = PozycjaPytajnika(pesel);
  105. int suma_kontrolna = oblicz_pesel(pesel,pozycja);
  106. for(int j = 0; j < 10; j++)
  107. {
  108. if((j*WagaDoPozycji(pozycja) + suma_kontrolna)%10 == (10 - (pesel[10] - '0')))
  109. {
  110. pesel[pozycja] = j + '0';
  111. break;
  112. }
  113. }
  114. }
  115.  
  116. int rok = (pesel[0] - '0') * 10 + (pesel[1] - '0') ;
  117. int dzien = (pesel[4] - '0') * 10 + (pesel[5] - '0') ;
  118. int miesiac = (pesel[2] - '0') * 10 + (pesel[3] - '0') ;
  119.  
  120. if(miesiac >= 1 && miesiac <= 12)
  121. rok += 1900;
  122. else if(miesiac >= 81 && miesiac <= 92)
  123. {
  124. rok += 1800; miesiac -= 80;
  125. }
  126. else if(miesiac >= 21 && miesiac <= 32)
  127. {
  128. rok += 2000; miesiac -= 20;
  129. }
  130. else if(miesiac >= 41 && miesiac <= 52)
  131. {
  132. rok += 2100; miesiac -= 40;
  133. }
  134. else if(miesiac >= 61 && miesiac <= 72)
  135. {
  136. rok += 2200; miesiac -= 60;
  137. }
  138.  
  139. if(kodKierownika[0] != '0') // szukaj plec 1 - mezczyzna 2 kobieta
  140. {
  141. if(kodKierownika[0] == '1')
  142. if( (pesel[9] - '0') % 2 == 0) plec = true;
  143. else plec = false;
  144. else
  145. if( (pesel[9] - '0') % 2 == 1) plec = true;
  146. else plec = false;
  147. }
  148. if(kodKierownika[1] != '0') // szukaj dzien tygodnia
  149. {
  150. if( dzienTygodnia(dzien,miesiac,rok) == (kodKierownika[1] - '0')) dzienB = true;
  151. else dzienB = false;
  152. }
  153. if(kodKierownika[2] != '0') // szukaj przestepny 1 - przestepny 2 - zwykly
  154. {
  155. if( (przestepny(rok) + 1) == (kodKierownika[2] - '0')) rokB = true;
  156. else rokB = false;
  157. }
  158.  
  159. if( rokB == true && dzienB == true && plec == true)
  160. wynik++;
  161. }
  162. cout << wynik << endl;
  163. return 0;
  164. }
  165.  
  166.  
  167. //Zadanie w systemie SPOJ (latwe)
  168. //
  169. //9649. Lista numerów PESEL
  170. //
  171. //Kod zadania: PESELLST
Success #stdin #stdout 0s 3412KB
stdin
050 8
03093069448
87452611859
84672745?27
6?300984627
014?0210104
71091632346
940526?9857
74822018228
stdout
1