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 Eratostenesa 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;
}