fork download
  1. #include <iostream>
  2. #include <time.h>
  3. #include <cstdlib>
  4.  
  5.  
  6. using namespace std;
  7.  
  8. bool czypierwsza(int n)
  9. {
  10. bool wynik=true;
  11. int dzielnik=2;
  12. while (dzielnik*dzielnik<=n)
  13. {
  14. if ( n%dzielnik==0) wynik=false;
  15. dzielnik++; // jezeli liczba podzieli sie przez kolejne dzielniki zwracamy falsz (liczba nie jesy pierwsza)
  16. }
  17. return wynik;
  18. }
  19. void sito(bool *tab, unsigned int k)
  20. {
  21. for (int i=2; i*i<=k; i++) // przeszukuje kandydatow na pierwsze
  22. {
  23. if(!tab[i]) //jesli liczba jest pierwsza bo ma wartosc 0 w naszej tab
  24. for (int j = i*i ; j<=k; j+=i)
  25. tab[j] = 1; //wielokrotnosc pierwszych ustawiamy na 1
  26. }
  27. }
  28. int sumacyfr10(int n)
  29. {
  30. if(n>0)
  31. return n%10 + sumacyfr10(n/10);
  32.  
  33. return 0;
  34. }
  35. int sumacyfr2(int n)
  36. {
  37. if(n>0)
  38. return n%2 + sumacyfr2(n/2);
  39.  
  40. return 0;
  41. }
  42.  
  43. main ()
  44. {
  45. int liczba, licznik=0, licznik2=0, suma2=0;
  46. char wybor;
  47. bool *tab;
  48. clock_t start, end;
  49. double czas;
  50.  
  51. /* ofstream w1 ("1.txt");
  52.   ofstream w2 ("2.txt");
  53.   ofstream w3 ("3.txt"); */
  54. cout << "\t*******************************************************************\n"
  55. << "\t*** PROGRAM ZLICZA LICZY PIERWSZE Z PODANEGO PRZEDZIALU ***\n"
  56. << "\t*** DODATKOWO MOZE ROZWIAZAC DODATKOWE PROBLEMY ***\n"
  57. << "\t*** Liczba super B pierwsza to taka ktore spelnia 3 warunki: ***\n"
  58. << "\t*** - jest liczba pierwsza ***\n"
  59. << "\t*** - suma cyfr tej liczby jest rowniez liczba pierwsza ***\n"
  60. << "\t*** - suma cyfr w zapisie binarnym jest takze liczba pierwsza ***\n"
  61. << "\t*******************************************************************\n\n";
  62.  
  63. cout << "Podaj przedzial zamkniety, w ktorym bedziemy szukac liczb pierwszych" << "\n(poczatek i koniec przedzialu oddziel spacja, <2...100000>: ";
  64. int p, k, p2;
  65. cin >> p >> k;
  66. p2=p;
  67.  
  68.  
  69. /* do {
  70.   cout << "\nCzy przy okazji wypisac wszystkie liczby pierwsze oddzielone spacjami? (t/n) ";
  71.   cin >> wybor;
  72.   }
  73.   while (wybor!='t' & wybor!='T' & wybor!='n' & wybor!='N'); */
  74. if (p==2 & k<=100000 & k>p) {
  75. clock_t start, end;
  76. double czas_obl;
  77. start=clock();
  78.  
  79. tab = new bool [k];
  80. for (int i=2;i<=k;i++) tab[i]=0;
  81.  
  82. sito (tab, k);
  83.  
  84. for(int i=2;i<=k;i++)
  85. {
  86.  
  87. if(!tab[i]) {
  88. licznik++ ;
  89. if (wybor=='t' || wybor=='T')
  90. cout << i << " ";
  91. }
  92.  
  93. }
  94. end=clock();
  95. czas_obl=1.0000*(end-start)/CLOCKS_PER_SEC; // czas wyznaczany jest w sekundach
  96.  
  97.  
  98. cout << "\a\nProblem rozostal rozwiazany za pomoca Sita Eratostenesa. Czas wykonywania to: " << czas_obl;
  99. // printf( "%.4fsek.", difftime( czasStop, czasStart ) );
  100.  
  101. }
  102. else {
  103. if (p>=2 & k<=100000 & k>p)
  104. {
  105. for (p;p<=k;p++)
  106. {
  107. if (czypierwsza (p)) {
  108. //if (czypierwsza ((sumcyfr (p, 10))) && czypierwsza ((sumcyfr (p,2))))
  109. licznik++;
  110. if (wybor=='t' || wybor=='T') cout << p << " ";
  111. }
  112. }
  113. cout << "\nProblem rozostal rozwiazany za pomoca algorytmu CzyPierwsza. Czas wykonywania to: ";
  114. }
  115. else cout << "Dane podane przez Ciebie sa nieprawidlowe!\n";
  116.  
  117.  
  118. }
  119. cout << "\nTakich liczb jest: " << licznik << "\n";
  120. cout << "\nDodatkowe zadania do rozwiazania.\n0) Zakoncz wykonywanie programu.\n"
  121. << "1) Sprawdz ile jest liczb super B pierwszych w tym przedziale.\n"
  122. << "2) Sprawdz ile jest liczb ktorych suma cyfr jest liczba pierwsza.\n"
  123. << "3) Sprawdz czy suma wszystkich liczb super B pierwszych jest liczba pierwsza.\n";
  124. int wybor2;
  125. cin >> wybor2;
  126. switch( wybor2 )
  127. {
  128. case 0:
  129. cout << "Koniec programu\n";
  130. break;
  131. case 1:
  132. {
  133. int spr1, spr2;
  134. int licznik2=0;
  135. for (p2;p2<=k;p2++) {
  136.  
  137. if (czypierwsza (p2) && czypierwsza (sumacyfr10 (p2)) && czypierwsza (sumacyfr2 (p2)))
  138. // cout << p2 << " ";
  139. licznik2++;
  140. }
  141. cout << "Liczb super B pierwszych jest: " << licznik2 << "\n";
  142. }
  143. break;
  144. case 2:
  145. for (p2;p2<=k;p2++)
  146.  
  147. if (czypierwsza (sumacyfr10 (p2))) licznik2++;
  148.  
  149.  
  150. cout << "Takich liczb jest: " << licznik2;
  151. break;
  152. case 3:
  153. for (p2;p2<=k;p2++)
  154. if (czypierwsza (p2)) suma2+=p2;
  155. if (czypierwsza (suma2)) cout << "TAK" << "\n";
  156. else cout << "NIE" << "\n";
  157. break;
  158. default:
  159. cout << "Wpisano zly argument!" << "\n";
  160. break;
  161. }
  162.  
  163.  
  164. system ("pause");
  165. }
  166.  
Success #stdin #stdout #stderr 0s 3304KB
stdin
Standard input is empty
stdout
	*******************************************************************
	*** PROGRAM ZLICZA LICZY PIERWSZE Z PODANEGO PRZEDZIALU         ***
	*** DODATKOWO MOZE ROZWIAZAC DODATKOWE PROBLEMY                 ***
	*** Liczba super B pierwsza to taka ktore spelnia 3 warunki:    ***
	*** - jest liczba pierwsza                                      ***
	*** - suma cyfr tej liczby jest rowniez liczba pierwsza         ***
	*** - suma cyfr w zapisie binarnym jest takze liczba pierwsza   ***
	*******************************************************************

Podaj przedzial zamkniety, w ktorym bedziemy szukac liczb pierwszych
(poczatek i koniec przedzialu oddziel spacja, <2...100000>: Dane podane przez Ciebie sa nieprawidlowe!

Takich liczb jest: 0

Dodatkowe zadania do rozwiazania.
0) Zakoncz wykonywanie programu.
1) Sprawdz ile jest liczb super B pierwszych w tym przedziale.
2) Sprawdz ile jest liczb ktorych suma cyfr jest liczba pierwsza.
3) Sprawdz czy suma wszystkich liczb super B pierwszych jest liczba pierwsza.
Wpisano zly argument!
stderr
sh: pause: not found