Uang Kembalian

Salah satu algoritma yang menguji kemampuan pemahaman array, looping, pembagian dan sisa pembagian adalah tentang menentukan uang kembalian yang harus diserahkan oleh kasir ke pembeli.

Misalkan, total belanja yang dibeli adalah Rp 11.000.
Di kasir, pembeli menyerahkan uang Rp 100.000.
Pertanyaan: Uang pecahan apa sajakah yang sebaiknya diserahkan ke pembeli untuk menghasilkan jumlah kembalian yang sesedikit mungkin? Misalkan bila total belanja adalah Rp 10.000 dan pembeli menyerahkan uang Rp 20.000 maka kasir sebaiknya menyerahkan selembar uang Rp 10.000, walau pun bisa juga dengan 2 lembar Rp 5.000 atau 5 lembar Rp 2.000.

Listing programnya adalah sebagai berikut:

/******************************************
Program menentukan uang kembalian di kasir.
(C) Mawan A. Nugroho, M.Kom
*******************************************/

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

int main() {
    unsigned long pecahan[] = {100000, 50000, 20000, 10000, 5000,
    2000, 1000, 500, 200, 100, 50, 25, 10, 1};
    
    unsigned long total;
    unsigned long uang;
    unsigned long kembalian;
    unsigned long genap;
    unsigned long sisa;
    
    unsigned int jumlahPecahan;
    unsigned int hitung;
    
    printf("Ketik total belanja: Rp ");
    scanf("%lu", &total);
    printf("Ketik uang yang diserahkan: Rp ");
    scanf("%lu", &uang);
    
    printf("\n");
    if (uang < total) {
        printf("Error: Uang yang diserahkan kurang.");  
    }
    else if (uang == total) {
        printf("Tidak ada uang kembalian.");
    }
    else {
        kembalian = uang - total;
        printf("Uang kembalian adalah Rp %lu\n", kembalian);
        printf("\n");
        printf("Yang meliputi pecahan:\n");
        
        jumlahPecahan = (int) (sizeof(pecahan) / sizeof(pecahan[0]));
        for (hitung = 0; hitung < jumlahPecahan; hitung++) {
            genap = floor(kembalian / pecahan[hitung]);
            sisa = kembalian % pecahan[hitung];
            if (genap > 0) {
                printf("%lu ", genap);
                if (pecahan[hitung] > 1000) {
                    printf("lembar");
                }
                else {
                    printf("keping");
                };
                printf(" uang pecahan Rp %lu\n", pecahan[hitung]);
            };
            kembalian = sisa;
        };
    };

    return 0;
}

Contoh outputnya adalah seperti di bawah ini:

Ketik total belanja: Rp 11000
Ketik uang yang diserahkan: Rp 100000

Uang kembalian adalah Rp 89000

Yang meliputi pecahan:
1 lembar uang pecahan Rp 50000
1 lembar uang pecahan Rp 20000
1 lembar uang pecahan Rp 10000
1 lembar uang pecahan Rp 5000
2 lembar uang pecahan Rp 2000