From 3c4ba7b2a4cabdbe5e8be869be5c571da0bddd1a Mon Sep 17 00:00:00 2001 From: slowy07 Date: Tue, 22 Oct 2024 19:44:28 +0700 Subject: [PATCH 1/2] feat: menambahkan algoritma dp menambahkan solusi dynamic programming untuk problem dynamic programming Signed-off-by: slowy07 --- .../dynamic_programming/angka_armstrong.cpp | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 algorithm/dynamic_programming/angka_armstrong.cpp diff --git a/algorithm/dynamic_programming/angka_armstrong.cpp b/algorithm/dynamic_programming/angka_armstrong.cpp new file mode 100644 index 0000000..24e2875 --- /dev/null +++ b/algorithm/dynamic_programming/angka_armstrong.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +namespace dynamic_programming { + +/** + * @brief cek apakah angka yang diberikan adalah angka armstrong + * @param angka angka yang akan di cek + * @return false jika angka yang diberikan bukan angka armstrong + * @return true jika benar + */ +template bool cek_armstrong(const T &angka) { + // inisialisasi variabel + int jumlah_digit = 0, sementara = angka, hasil = 0, sisa = 0; + + // hitung jumlah digit dari angka yang diberikan + // contoh: 153 memiliki 3 digit + while (sementara != 0) { + // hapus digit terakhir + sementara /= 10; + // tambah jumlah digit + jumlah_digit++; + } + + // hitung untuk memeriksa apakah adalah angka armstrong + // pada angka dengan n-digit, jumlah digit yang dipangkatkan dengan n + // harus sama dengan aslinya + sementara = angka; + while (sementara != 0) { + // ambil digit terakhir + sisa = sementara % 10; + // pengkatkan dengan jumlah digit + hasil += static_cast(std::pow(sisa, jumlah_digit)); + // hapus digit terakhir + sementara /= 10; + } + + // jika hasil sama dengan angka asli, maka angka armstrong + if (hasil == angka) { + return true; + } else { + // jika tidak sama dengan parameter yang diberikan + return false; + } +} +} // namespace dynamic_programming + +/** + * @brief implementasi testing + * @return void + */ +static void testing() { + // untuk testing angka armstrong + assert(dynamic_programming::cek_armstrong(153) == true); + assert(dynamic_programming::cek_armstrong(370) == true); + + // untuk testing angka bukan angka armstrong + assert(dynamic_programming::cek_armstrong(15) == false); + assert(dynamic_programming::cek_armstrong(103) == false); + + std::cout << "testing pass!" << std::endl; +} + +int main() { + testing(); + return 0; +} From 8c224e40f2aad1366953880aab97be6c93946cf7 Mon Sep 17 00:00:00 2001 From: slowy07 Date: Tue, 22 Oct 2024 20:42:44 +0700 Subject: [PATCH 2/2] fix(codacy): minor fixing +2 issue - memperbaiki scope dari variable `sisa` bisa di reduce - memperbaiki variable `sisa` di assign tapi tak pernah digunakan Signed-off-by: slowy07 --- algorithm/dynamic_programming/angka_armstrong.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/algorithm/dynamic_programming/angka_armstrong.cpp b/algorithm/dynamic_programming/angka_armstrong.cpp index 24e2875..1abd181 100644 --- a/algorithm/dynamic_programming/angka_armstrong.cpp +++ b/algorithm/dynamic_programming/angka_armstrong.cpp @@ -11,7 +11,7 @@ namespace dynamic_programming { */ template bool cek_armstrong(const T &angka) { // inisialisasi variabel - int jumlah_digit = 0, sementara = angka, hasil = 0, sisa = 0; + int jumlah_digit = 0, sementara = angka, hasil = 0; // hitung jumlah digit dari angka yang diberikan // contoh: 153 memiliki 3 digit @@ -28,7 +28,7 @@ template bool cek_armstrong(const T &angka) { sementara = angka; while (sementara != 0) { // ambil digit terakhir - sisa = sementara % 10; + int sisa = sementara % 10; // pengkatkan dengan jumlah digit hasil += static_cast(std::pow(sisa, jumlah_digit)); // hapus digit terakhir