Skip to content

Instantly share code, notes, and snippets.

@karol-preiskorn
Created January 19, 2016 19:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save karol-preiskorn/8fdffce35f237762d275 to your computer and use it in GitHub Desktop.
Save karol-preiskorn/8fdffce35f237762d275 to your computer and use it in GitHub Desktop.
W zakresie 30 do 30000 takie, że zarówno suma, jak i iloczyn ich cyfr są również liczbami pierwszymi
#include <stdlib.h> /* qsort() */
#include <stdio.h> /* printf() */
// tablica liczb pierwszych
int tablica[30001];
/**
Sito Erastotenesa
https://pl.wikipedia.org/wiki/Sito_Eratostenesa
Eratostenes w trzecim wieku przed naszą erą przedstawił następujący
algorytm wyszukiwania liczb pierwszych. Wszystkie wielokrotności liczby
2 większe od niej samej oznaczamy jako liczby złożone. Z liczb większych
od 2 wybieramy najmniejszą niezaznaczoną jeszcze liczbę (czyli 3) i
wszystkie jej wielokrotności większe od niej samej oznaczamy jako
złożone (niektóre liczby będą zaznaczane więcej niż raz). Postępując dalej
według tej procedury jako liczby złożone oznaczamy wielokrotności 5, 7,
11 it.d. Dla danej liczby n wszystkie liczby mniejsze od n, które w efekcie
powyższej procedury nie zostały oznaczone jako złożone, są liczbami
pierwszymi.
Ustalmy liczbę
n
i wszystkie liczby mniejsze od niej oznaczamy jedynką.
cout << "Ile liczb sprawdzić? \n";
cin >> n;
int* T; //deklarujemy tablicę
T = new int[n]; //definiujemy rozmiar tablicy
for(i = 2; i < n; i++)
T[i] =1; //kolejne liczby zaznaczamy
//jako potencjalnie pierwsze
Zerem oznaczamy wszystkie liczby mniejsze od
n
, które są złożone,
for (i = 2; i <= n; i++)
if (T[i]==1)
for (j = i; j*i < n; j++)
T[i*j] =0;
i wypiszmy liczby pierwsze mniejsze od
n
(czyli te numery, dla których
wartość elenentu tablicy jest równa 1).
for (i = 2; i < n; i++)
if (T[i]==1)
cout << i << ", ";
*/
/**
* zwraca iloczyn czy suma i iloczyn liczb jest liczbą pierwszą.
*/
int suma_iloczyn(int i) {
int t[5], w = 0, s = i, k, suma = 0, iloczyn = 1;
while (s > 0) {
t[w] = s % 10;
s /= 10;
w++;
}
for (k = 0; k < w; k++) {
suma += t[k];
iloczyn *= t[k];
}
// zwraca iloczyn czy suma i iloczyn liczb jest liczbą pierwszą.
return (tablica[suma] && tablica[iloczyn]);
}
/**
*
* sortowanie
*
*/
int intcmp(const void *a, const void *b) {
const int *ia = (const int *) a; // casting pointer types
const int *ib = (const int *) b;
return (*ia - *ib);
/* integer comparison: returns negative if b > a
and positive if a > b */
}
/**
*
*
*/
int main() {
int i, j;
int liczby_pierwsze[100], lp_iter = 0;
// ustaw jeden dla wszyskich
for (i = 1; i <= 30000; i++) {
tablica[i] = 1;
}
for (i = 2; i <= 30000; i++) {
if (tablica[i]) {
j = 2 * i; // przejdź od liczby 2*i do n przesuwając się o i
while (j <= 30000) {
tablica[j] = 0; // i każdą z nich usuwaj ze zbioru
//printf("%d[%d]",j,tablica[j]);
j += i;
}
}
}
printf("LICZBY PIERWSZE - Sito Erastotenesa\n");
printf("------------------------------------\n");
printf("W zakresie 30 do 30000 takie, że zarówno suma, jak i iloczyn ich cyfr są również liczbami pierwszymi\n");
for (i = 30; i < 30001; i++) {
if (tablica[i] && suma_iloczyn(i)) {
liczby_pierwsze[lp_iter++] = i;
//printf("%d, ", i);
}
}
qsort(liczby_pierwsze, lp_iter, sizeof(int), intcmp);
for (int i = 0; i < lp_iter; i++)
printf("%d | ", liczby_pierwsze[i]);
putchar('\n');
return (1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment