# Praktikum 2

## Pengantar

Pada praktikum ini kita akan membuat program untuk menghitung nilai pangkat suatu angka menggunakan 2 jenis algoritma, yaitu, *brute force* dan *divide conquer*.

## Pecobaan

* Pada direktori proyek "`BruteForceDivideConquer`" buatlah kelas baru bernama "`Pangkat`".
* Tambahkan atribut berikut,

```java
public int nilai, pangkat;
```

* Buatlah sebuah method dengan nama `pangkatBF()`.

{% code overflow="wrap" %}

```java
public int pangkatBF(int a, int n) {
    int hasil = 1;
    for (int i = 0; i < n; i++) {
        hasil = hasil * a;
    }
    return hasil;
}
```

{% endcode %}

* Buatlah method lain dengan nama `pangkatDC()`.

```java
public int pangkatDC(int a, int n) {
    if(n==0) {
        return 1;
    } else {
        if(n%2==1) {
            return (pangkatDC(a, n/2)*pangkatDC(a, n/2)*a);
        } else {
            return (pangkatDC(a, n/2)*pangkatDC(a, n/2));
        }
    }
}
```

* Perhatikan apakah sudah tidak ada kesalahan yang muncul dalam pembuatan class `Pangkat`.
* Selanjutnya buat class baru yang di dalamnya terdapat method main. Class tersebut dapat dinamakan `MainPangkat`. Tambahkan kode pada class main untuk menginputkan jumlah nilai yang akan dihitung pangkatnya.

```
Scanner sc = new Scanner(System.in);
System.out.println("======================");
System.out.println("Masukkan jumlah elemen yang ingin dihitung : ");
int elemen = sc.nextInt();
```

* Selanjutnya digunakan untuk instansiasi *array of objects*. Di dalam kode berikut ditambahkan proses pengisian beberapa nilai yang akan dipangkatkan sekaligus dengan pemangkatnya.

```java
Pangkat[] png = new Pangkat[elemen];

for(int i=0; i<elemen; i++) {
    png[i] = new Pangkat();
    System.out.println("Masukkan nilai yang akan dipangkatkan ke-"+(i+1)+" : ");
    png[i].nilai = sc.nextInt();
    System.out.println("Masukkan nilai pemangkat ke-"+(i+1)+" : ");
    png[i].pangkat = sc.nextInt();
}
```

* Kemudian panggil method `pangkatBF()` dan `pangkatDC()`.

```java
System.out.println("=====================");
System.out.println("Hasil Pangkat dengan Brute Force");

for(int i=0; i<elemen; i++) {
    System.out.println("Faktorial dari nilai "+png[i].nilai+" pangkat "
        +png[i].pangkat+" adalah "+pangkatBF(png[i].nilai, png[i].pangkat));
}

System.out.println("=====================");
System.out.println("Hasil Pangkat dengan Divide and Conquer");

for(int i=0; i<elemen; i++) {
    System.out.println("Faktorial dari nilai "+png[i].nilai+" pangkat "
        +png[i].pangkat+" adalah "+pangkatDC(png[i].nilai, png[i].pangkat));
}

System.out.println("=====================");
```

## Verifikasi Hasil Percobaan

Pastikan output dari program serupa dengan gambar berikut,

<figure><img src="https://3303136777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYswnbGm4Ak9kOqe8uURG%2Fuploads%2FFrXaiIly2c059ktBTYUo%2Fimage.png?alt=media&#x26;token=ed973f35-1ff8-4ee6-8406-7ae9e12a5422" alt=""><figcaption><p>Hasil Percobaan Program Pangkat dengan Brute Force dan Divide Conquer</p></figcaption></figure>

## Pertanyaan

* Pada method `pangkatDC()` terdapat potongan kode sebagai berikut,

<pre class="language-java"><code class="lang-java">if(n%2==1) {
  return (pangkatDC(a, n/2)*pangkatDC(a, n/2)*a);
<strong>} else {
</strong><strong>  return (pangkatDC(a, n/2)*pangkatDC(a, n/2));
</strong>}
</code></pre>

Apa maksud dari potongan kode tersebut?

* Apakah tahap *combine* sudah termasuk dalam kode tersebut? Tunjukkan!
