Rabu, 28 Desember 2011

[programming] x + y + z = constanta | berapa banyak siolusi non-negaif yang dapat terjadi?

         oke sekedar catatan iseng-iseng /ngupil. Kali ini saya akan menunjukkan bagaimana menyelesaikan kasus matematik (sesuai judul diatas) secara algoritis(kata serapan dari algoritma /hihiii). Sebelum kita melangkah ke algoritmanya, kita simak dulu konsep penyelesainnya, kali ini saya menggunakan metode plotting :

kita misalkan constanta =  100 sehingga x+y+z = 100 maka plot nya :
100+0+0 | 99+1+0 | 98+2+0 | 97+3+0 | ...dst... 0+100+0 | 99+0+1 | 98+1+1 | 97+2+1 | ...dst... 97+0+2 | 96+1+2 | ....dst..sampai.. 0+0+100
bisa kita liat disini pertama kali yg mengalami peningkatan/jumlah yang paling tinggi terlebih dahulu adalah x {100+0+0 | 99+1+0 ...} lalu disusul y dan yang terakhir adalah z. Jadi pada saat x mencapai  puncak maka y akan naik dan pada saat y mencapai puncak maka z akan naik, dan seterusnya jika soalnya ingin lebih dari dari 3 variabel [a+b+c+d+....=constanta].

Waktunya merealisasikan konsep tersebut dalam algorithma pemrograman. Oke berikut lagoritma komplitnya yang saya tulis dalam bahasa C (penjelasan menyusul) :

int calculate (int constanta) { /*x+y+z=constanta -> berapa kemungkinan*/
    unsigned int x, y, z, cycle, solusi;
    cycle = 0;

    z=0; // reset dan buat jaga2
    for(;z<=constanta;z++) { // 3.kalkulasi ketiga
        y=0; // reset
        for(;y<=constanta;y++) { // 2.kalkulasi kedua
            solusi = 0;x=0; //reset
            for(;solusi<=constanta;x++) { // 1.check jika x+y+z nilainya belum sama dengan constanta
                solusi = z + y + x; // stor sementara hasil x+y+z
                if (solusi==constanta) { // counting jumlah kemungkinan jika benar x+y+z = constanta "buat jaga2"
                    printf("%d %d %d | ",x,y,z); // print solusi di layar
                    cycle++; // counting jumlah solusi jika = constanta
                }
            }
        }
    }
    return cycle;
}

2 wong sing ngomong:

cimenx mengatakan... Reply to comment

belum effisien!

cimenx mengatakan... Reply to comment

@cimenx harusnya dikasih chekpoint jadi loop-nya ga kebanyaken. misal 1-30, 31-60, 61-100. Jadinya ga perlu counting 1-100 bwt liat mana yang memnuhi persamaan.

Poskan Komentar