Series C/C++ kali ini masih untuk latihan dasar pemrograman. Sekarang giliran kita membuat fungsi bilangan di Matematika yaitu Fibonaci, Faktorial dan Prima. Biasanya ketiga fungsi bilangan tersebut selalu muncul saat test masuk kerja bagi Programmer :D . 

1. Bilangan Prima 

Seperti dijelaskan sebelumnya , bilangan prima atau sering disebut Primary number adalah bilangan lebih dari 1 dan hanya mempunyai 2 faktor pembagi yaitu 1 dan dirinya sendiri. perhatikan ilustrasi berikut

  2           3          5
 /   \        /  \        /  \           ...................dst ( ingat syratnya : 1 dan dirinya sendiri)
1   2      1  3      1   5

Dalam logika program, setiap bilangan harus dievaluasi semua kemungkinan faktor pembaginya. 

   2           3            4                5
 /   \        / | \         / / \ \         /  /  | \  \    .................dst
1   2      1 2 3      1 2 3 4     1 2 3 4 5  

ini bisa di kode sbb :

int prima(int n){
   int i,j;
   for(i=1;i<=n;++i){
       
       printf("Angka %d \n",i);
       printf("=========\n");
       int counter = 0;
       for(j=1;j<=i;++j){
          
           if(i % j==0){
              ++counter;
           }
       }
      
      /*bil prima tepat punya 2 buah faktor
        yaitu 1 dan dirinya sendiri*/
      if(counter==2)
        printf("Bil %d Prima",i);
        
      printf("\n");
   }
}

Namun kode diatas tidak maksimal, bayangkan jika angka yg akan di test besar....seperti ilustasi diatas, kita harus satu-satu check dengan pembagi nya. Banyak cara untuk mempercepat menentukan bil Prima misal dengan men-Cek apakah bilangan tersebut genap atau tidak . Karena jika ia genap (kecuali angka 2 , karena 2  = satu-satu nya angka genap yg masuk bilangan prima) sudah pasti ia bukan prima. Silahkan coba-coba. Sekarang kita akan pakai cara lain yaitu dengan cara Test dengan Faktor pembagi antara 1 sampai Akar dari angka tersebut dibulatkan : 

2 <= m <= ceil(akar n)  , dimana m adalah faktor pembagi dan n adalah bil yg mau di test. 

int prima(int n){

   int i,j;
   for(i=2;i<=n;++i){
      int flag = 0;
      
      if(i % 2 !=0 ){                         
        //cek dari 3 saja, krena 1 sdh pasti faktor pembaginya
        for(j=3;j<=(int)ceil(sqrt(i));++j){
             
             /*check apakah i habis dibagi j, 
                jika ya maka flag++ artinya bkn prima*/
             if(i % j ==0){                                
                flag++;               
             }                             
        }           
               
       }else{
         
         if(i!=2)
            flag++;
       }
          
       if(flag==0){          
           printf("Bil %d  = prima \n",i);
       }     
   }
}
Agak sedikit rumit tpi cukup membantu untuk angka yang besar, mungkin kamu bisa improve kode nya masing-masing.

2. Faktorial 

Faktorial memenuhi rumus atau aturan seperti berikut : 

Jika n = 6 , maka n faktorial (n!)  =  n x (n-1)! , atau lengkapnya = 6 x 5 x 4 x 3 x 2 x 1

int faktorial(int n){

    int i;
    int hasil=1; //penampung sementara
    for(i=n;i>=1;--i){       
        hasil =hasil * i;            
    }
    
    printf("Faktorial %d! = %d \n",n,hasil);
}

2. Fibonaci 

Fibonaci adalah bilangan dimana bilangan yang di sedang amati adalah hasil penjumlahan dari dua buah bilangan sebelumnya

misal : 1 1 2   dua adalah bilangan yg sedang kita amati adalah hasil penjumlahan dua buah bilangan sebelumnya. Fibonaci akan membentuk sebuah deret bilangan ( deret fibonaci). 

ada beberapa cara untuk mencari fibonaci , diantaranya adalah : 

a. Fungsi rekursif , yang memenuhi formula berikut




Dimana n adalah bilangan fibonaci digit ke-n
Dengan formula rekursif diatas akan membentuk pola perhitungan sbb : 
Jika bilangan itu > 1
F(2) = F(2-1) + F(2-2)
     = F(1)   + F(0) 
     = 1 + 0 = 1   //substitusi kedalam fungsi rumus
Begitu seterusnya secara rekursif. Namun secara rekursif kurang disenangi karena memakan banyak memory di Komputer. 

b. Cara Logika biasa dan Matematika

   b.1 Logika Biasa 

 int fibonaci(int n){

    int i,next,a=0,b=1;
    for(i=0;i<n;++i){
    
        if(i<=1){
            next = i;
        }else{
            
            next = a + b;
            a = b;
            b= next;
        }
        
        printf("%d ",next);
    }
}

  b.2 Cara matematika

    Yang memenuhi formula Fn = (x1n – x2n) / akar(5)  dengan pembulatan kebawah
    dimana X1 dan X2 adalah akar-akar dari persamaan Kuadrat    x - x - 1=0          
   Untuk mencari X1 dan X2 dapat dicari dengan 
   

   Maka didapat X1,X2  =>    
  DI program kita buat seperti ini

int fibonaci(int n){
    
    int i;float tmp;
    
    //x^2 - x - 1 =0
    float x1 = ( 1 + sqrt(5) ) / 2;
    float x2 = (1 - sqrt(5) ) / 2;  
    
    for(i=0;i<n;i++){
               
        tmp = (pow(x1,i) - pow(x2,i)) / sqrt(5);
        printf("%d ",(int)floor(tmp)); //pembulatan kebawah         
    }
    
    printf("\n");
}

Begitulah kira-kira :D 


Untuk memanggil fungsi-fungsi diatas : 


#include <stdio.h>
#include <math.h>
//fungsi-fungsinya.......
int main(){
   //fibonaci(5); //panggil disini.......
   return 0;
}


Jalankan dicompiler, jika anda di linux dan tidak ada compiler tapi sudah install GCC, jalankan di terminal : 

ubuntu@AcerXtimeline:~/Contoh_C$ gcc -o bilangan bilangan.c -lm
ubuntu@AcerXtimeline:~/Contoh_C$ ./bilangan 


NOTES :  Selain cara-cara diatas tentunya masih banyak cara lain, silahkan coba sendiri :D


Happy Coding !!!