Kody źródłowe kilku programów dot. liczb pierwszych i faktoryzacji...
Pierwsza czy złożona? - Primality Test
Najprostszy i niezawodny Primality Test oparty o sito Eratosthenesa jaki udało mi się wymyślić.
Test jest napisany w języku ANSI C, także proszę pamiętać o prototypie funkcji na początku programu,
a także o dołączeniu nagłówka z funkcjami matematycznymi (math.h)
int eratosthenes(long num) {
if(num <= 1) return 0;
for(int i = 2; i <= (long)sqrt(num); i++) {
if(num % i == 0) return 0;
}
return 1;
}
Funkcja przetestuje przekazaną liczbę i zwróci 1 jeśli liczba jest liczbą pierwszą,
0 zostanie zwrócone jeśli liczba jest liczbą złożoną.Poniżej zrzut ekranu prezentujący dzałanie powyższej funkcji na prostym przykładzie:

Jeszcze jeden przykład z dodaną pętlą i kolorkami sprawdzający podany zakres liczb

Przykład wykorzystujący to co jest na tej i poprzedniej stronie w jednym: 168 liczb pierwszych, czyli przeszukany pierwszy tysiąc liczb w systemie decymalnym, binarnym, oktalnym i hexadecymalnym:

Prime Factors - faktoryzacja liczb
to dopiero początek zabawy, zajmijmy się rozkładem liczb złożonych.
Program po podaniu zakresu liczb rozłoży liczby złożone i oznaczy pierwsze.
#include <stdio.h>
#include <math.h>
void printfactors(long);
int eratosthenes(long);
int main(void) {
long testnum, start, stop;
printf("Podaj pozytywną liczbę całkowitą, od której rozpocząć faktoryzację: ");
scanf("%ld", &start);
printf("Podaj liczbę, na której zakończyć faktoryzację: ");
scanf("%ld", &stop);
printf("\n\n");
testnum = start;
for(start; start <= stop; start++) {
if(eratosthenes(testnum) == 1) {
printf("\033[1;31m%ld ---> brak dzielników - LICZBA PIERWSZA\n", testnum);
testnum++;
} else {
printfactors(testnum);
testnum++;
}
}
printf("\n\n");
return 0;
}
void printfactors(long n) {
long factor = 1;
printf("\033[1;32m%ld = ", n);
if(n == 1) printf("\033[1;32m %ld ", n);
while(n >= 2) {
factor++;
if(n % factor == 0) {
printf(" %ld ", factor);
n /= factor;
factor = 1;
}
}
printf("\n");
}
int eratosthenes(long num) {
if(num <= 1) return 0;
for(int i = 2; i <= (long)sqrt(num); i++) {
if(num % i == 0) return 0;
}
return 1;
}
