Penjumlahan Bilangan Bulat ( Bilangan besar )

Komputer bisa menjumlahkan angka dengan operator penjumlahan. Tetapi setiap angka disimpan sesuai tipe data yang digunakan. Angka tidak bisa melebihi batas tipe data karena data disimpan dalam ukuran byte yang tetap. Tipe data minimal yaitu char hanya menyimpan maksimal 1 byte yang nilainya sama dengan 0 sampai dengan 255. Tipe data int standar biasanya hanya menyimpan 4 byte atau sekitar 0 hingga 65535.

Jika kita ingin membuat program yang menjumlahkan bilangan melebihi batas tipe data terbesar dalam bahasa C atau C++ kita tidak bisa hanya mengandalkan operator penjumlahan(+) dan tipe data dasar. Kita harus menyimpan karakter dari dua bilangan yang akan dijumlahkan ke dalam string. Kemudian kita baru bisa melakukan penjumlahan dengan jumlah bilangan yang besar dengan function yang perlu kita buat.

Sekalipun beberapa bahasa pemrograman sebenarnya sudah mempermudah penggunaan "Big Number" dengan library atau variabel dinamis, tidak ada salahnya kita mencoba membuat kode program penjumlahan bilangan besar dengan bahasa C atau C++. Anggap saja ini sebagai pengasah logika kita dan mengingatkan kita pada dasar dari penjumlahan susun ke bawah.

Berikut ini adalah contoh penjumlahan dua " bilangan besar " yang ukurannya maksimal 100 karakter atau digit.
#include <stdio.h>
#include <string.h>

typedef char Angka[100];

int Penjumlahan(char *a1, char *a2, char *hasil){
int n1, n2, sisa=0, i=0;
char *tmp;
    n1=strlen(a1);
    n2=strlen(a2);
    if(n1 < n2){
        //tukar pointer
        tmp=a1;
        a1=a2;
        a2=tmp;
        //tukar panjang
        sisa=n1;
        n1=n2;
        n2=sisa;
    }

    sisa=0;
    while(n2>0){
        hasil[i]=(a1[n1-1]-'0')+(a2[n2-1])+sisa;
        sisa=0;
        if(hasil[i]>'9'){
            hasil[i]-=10;
            sisa=1;
        }
        n1--;
        n2--;
        i++;
    }

    while(n1>0){
        hasil[i]=a1[n1-1]+sisa;
        sisa=0;
        if(hasil[i]>'9'){
            hasil[i]-=10;
            sisa=1;
        }
        n1--;
        i++;
    }
    if(sisa!=0){
        hasil[i]='1';
        i++;
    }

    hasil[i]=0;

    //balik hasil
    n1=strlen(hasil);
    n2=n1/2;
    n1--;

    for(i=0;i<n2;i++){
        sisa=hasil[i];
        hasil[i]=hasil[n1-i];
        hasil[n1-i]=sisa;
    }
    return 0;
}

int main(){
Angka s1="1200";
Angka s2="32945";
Angka hasil="";
    printf("bilangan ke-1 : ");scanf("%s", s1);
    printf("bilangan ke-2 : ");scanf("%s", s2);
    Penjumlahan(s1, s2, hasil);
    printf("%s", hasil);
    return 0;
}
Kalian bisa mengubah arraynya jika ingin lebih banyak digit atau angka yang kalian gunakan untuk setiap angka. Untuk array yang menyimpan "hasil" lebih baik dilebihkan 1 "karakter". Oh ya, dalam kode program di atas ada juga fungsi untuk membalikkan string yang mungkin bisa berguna untuk kalian.

Selain cara diatas masih ada banyak cara untuk melakukan penjumlahan dua bilangan besar. Salah satunya bisa kalian lihat di bawah ini.
#include <stdio.h>
#include <string.h>


int tambahkan_nol(char* a, int panjang1, int panjang2){
int i, j, selisih;
    selisih=panjang2-panjang1;
    i=panjang2-1;
    j=panjang1-1;
    while(i>=selisih){
        a[i]=a[j];
        j--;
        i--;
    }
    i=0;
    while(i<selisih){
        a[i]='0';
        i++;
    }
     a[panjang2]=0;
     return 0;
}

int penjumlahan(char *a, char *b, char *c){
int i, j, panjang;
char csisa;
    i=strlen(a);
    j=strlen(b);

    if(i<j){
        tambahkan_nol(a, i, j);
        panjang=j;
    }else{
         tambahkan_nol(b, j, i);
         panjang=i;
    }

    i=panjang-1;
    csisa=0;
    while(i>=0){
        c[i]=a[i]-'0'+b[i]+csisa; 
        if(c[i]>'9'){ 
            c[i]-=10;
            csisa=1;
        }else csisa=0;
        i--;
     }

     if(csisa==1){
        i=0;
        i=panjang;
        while(i>0){
            c[i]=c[i-1];
            i--;
        }

        c[0]='1';
        panjang++;
    }
    c[panjang]=0;

    return 0;
}

int main(){
char a[100], b[100], hasil[101];
    printf("bilangan ke-1 : ");scanf("%s", &a);
    printf("bilangan ke-2 : ");scanf("%s", &b);
    penjumlahan(a, b, hasil);
    printf("Hasil : %s\n", hasil);

    return 0;
} 
Hasilnya seharusnya sama dengan kode program sebelumnya, hanya caranya yang berbeda. Jika ada kesalahan atau kurang akurat saya mohon komentarnya. Selamat mencoba!

Perkalian 
Kalau kalian sedikit mengembangkan program penjumlahan tersebut, kalian bisa mendapatkan penjumlahan dua variabel. Kalian juga bisa mengembangkannya lagi menjadi program untuk menghitung perkalian bilangan besar.

Di bawah ini, saya sudah mengubah function penjumlahannya menjadi penjumlahan dengan dua variabel. Saya juga menggunakannya dalam perkalian.


#include <stdio.h>
#include <math.h>
#include <string.h>

typedef char Angka[100];

int tambahnol(char *s, int geser){
int i, n=strlen(s)+geser;
        for(i=n;i>=geser;i--)s[i]=s[i-geser];
        s[n]=0;

        for(i=0;i<geser;i++)s[i]='0';
 return n;
}

int Penjumlahan(char *a1, char *a2){
int n=0, sisa=0, i=0;
    i=strlen(a1);
    n=strlen(a2);
    if(i<n){
        i=tambahnol(a1, n-i);
 i=n;
    }else{
        i=tambahnol(a2, i-n);
    }

    n=i;
    while(i>0){
        i--;
        a1[i]+=a2[i]-'0'+sisa;
        sisa=0;
        if(a1[i]>'9'){
            a1[i]-=10;
            sisa=1;
        }
    }

    if(sisa>=1){
        for(i=n;i>0;i--)a1[i]=a1[i-1];
        a1[n+1]=0;
        a1[0]='0'+sisa;
    }

    return 0;
}

int Perkalian(char *a1, char *a2, char *hasil){
int pj=0;
int n=0;
int i=0;
int j=0;
char *tmp;
    hasil[0]='0';hasil[1]=0;
    if(strlen(a1)<strlen(a2)){
        tmp=a1;
        a1=a2;
        a2=tmp;
    }
    pj=strlen(a2);
    for(i=pj-1;i>=0;i--){
        n=a2[i]-'0';
        for(j=0;j<n;j++){
            Penjumlahan(hasil, a1);
        }
        n=strlen(a1);
        a1[n]='0';
        a1[n+1]=0;
    }

    return 0;
}

int main(){
Angka s1="10998";
Angka s2="119";
Angka hasil="0";
    /*printf("bilangan ke-1 : ");scanf("%s", s1);
    printf("bilangan ke-2 : ");scanf("%s", s2);
    Penjumlahan(hasil, s2);
    Penjumlahan(hasil, s1);
    printf("Hasil Penjumlahan  : %s\n", hasil);
    */

    Perkalian(s2, s1, hasil);
    printf("Hasil Perkalian  : %s\n", hasil);
    return 0;
}
Hmmm...., kalau kalian cuma mau menggunakan function penjumlahan di kode program di atas tanpa perkalian, mungkin function penjumlahannya juga sedikit diubah.

Penerapan untuk Faktorial
Setelah kita mengubahnya menjadi perkalian, kita bisa mengembangkannya lagi menjadi program lain seperti program untuk mencari pangkat atau faktorial. Berikut ini adalah contoh kode program untuk mencari faktorial. :p
#include <stdio.h>
#include <math.h>
#include <string.h>

typedef char Angka[100];

int tambahnol(char *s, int geser){
int i, n=strlen(s)+geser;
        for(i=n;i>=geser;i--)s[i]=s[i-geser];
        s[n]=0;

        for(i=0;i<geser;i++)s[i]='0';
 return n;
}

int Penjumlahan(char *a1, char *a2){
int n=0, sisa=0, i=0;
    i=strlen(a1);
    n=strlen(a2);
    if(i<n){
        i=tambahnol(a1, n-i);
 i=n;
    }else{
        i=tambahnol(a2, i-n);
    }

    n=i;
    while(i>0){
        i--;
        a1[i]+=a2[i]-'0'+sisa;
        sisa=0;
        if(a1[i]>'9'){
            a1[i]-=10;
            sisa=1;
        }
    }

    if(sisa>=1){
        for(i=n;i>0;i--)a1[i]=a1[i-1];
        a1[n+1]=0;
        a1[0]='0'+sisa;
    }

    return 0;
}

int Perkalian(char *a1, char *a2, char *hasil){
int pj=0;
int n=0;
int i=0;
int j=0;
char *tmp;
    hasil[0]='0';hasil[1]=0;
    if(strlen(a1)<strlen(a2)){
        tmp=a1;
        a1=a2;
        a2=tmp;
    }
    pj=strlen(a2);
    for(i=pj-1;i>=0;i--){
        n=a2[i]-'0';
        for(j=0;j<n;j++){
            Penjumlahan(hasil, a1);
        }
        n=strlen(a1);
        a1[n]='0';
        a1[n+1]=0;
    }

    return 0;
}

int main(){
Angka s1="1";
Angka s2="1";
Angka hasil="0";
int n;
    /*printf("bilangan ke-1 : ");scanf("%s", s1);
    printf("bilangan ke-2 : ");scanf("%s", s2);
    Penjumlahan(hasil, s2);
    Penjumlahan(hasil, s1);
    printf("Hasil Penjumlahan  : %s\n", hasil);
    */
    printf("Faktorial : ");scanf("%d", &n);

    for(int i=1;i<=n;i++){
        sprintf(s2, "%d", i);
        Perkalian(s1, s2, hasil);
        strcpy(s1, hasil);
    }
    printf("Hasil Perkalian  : %s\n", s1);
    return 0;
}
Hmm..., kalau mungkin hasilnya ternyata kurang tepat, mohon dilaporkan lewat komentar. :p