Kody źródłowe kilku programów dot. liczb pierwszych i faktoryzacji...




Pierwsza czy złożona? - Primality Test

Zacznijmy od podstaw:
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

Przejdźmy teraz do faktoryzacji, samo ustalenie czy liczba jest pierwsza czy złożona,
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;
}