ภาพรวม
ได้รับสตริงที่มีเลขฐานสอง (Binary) เป้าหมายคือหาเลขฐานสิบ (Decimal) เทียบเท่าโดยใช้วิธีการเรียกซ้ำ (Recursive)
การแปลงฐานสองเป็นฐานสิบ: เดินจาก LSB (Least Significant Bit) ไป MSB คูณแต่ละบิตด้วย 2i โดย 0≤i<จำนวนหลัก บวกผลลัพธ์ก่อนหน้า
ตัวอย่าง
อินพุต − binStr[] = "110010"
เอาต์พุต − Equivalent Decimal of given binary: 50
คำอธิบาย −
= 0×20 + 1×21 + 0×22 + 0×23 + 1×24 + 1×25
= 0 + 2 + 0 + 0 + 16 + 32 = 50
อินพุต − binStr[] = "0011"
เอาต์พุต − Equivalent Decimal of given binary: 3
คำอธิบาย −
= 1×20 + 1×21 + 0×22 + 0×23 = 1 + 2 + 0 + 0 = 3
แนวทางการแก้ปัญหา
ใช้ฟังก์ชันเรียกซ้ำ bintoDecimal(strBin, length) รับสตริงและความยาว สำหรับแต่ละตัวอักษร แปลงเป็นค่าทศนิยม คูณด้วย 2i บวกผลลัพธ์จากตัวถัดไป
- รับสตริง
strBin[]ที่มีเลขฐานสอง - คำนวณความยาวด้วย
strlen(strBin) - ฟังก์ชัน
bintoDecimal(char binary[], int len, int i=0)คืนค่าทศนิยม - Base case: หากอยู่ที่ตัวสุดท้าย (LSB) คืนค่า
binary[i] - '0'(คูณ 1 = 20) - มิฉะนั้น
temp = binary[i] - '0'คูณtemp <<= len-i-1(เทียบเท่า ×2len-i-1) - บวกผลลัพธ์ตัวถัดไป
temp += bintoDecimal(binary, len, i+1) - คืนค่า
temp - พิมพ์ผลลัพธ์ใน main
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
int bintoDecimal(char binary[], int len, int i = 0){
if (i == len - 1)
return (binary[i] - '0');
int temp = binary[i] - '0';
temp = temp << (len - i - 1);
temp = temp + bintoDecimal(binary, len, i + 1);
return (temp);
}
int main(){
char strBin[] = "11010";
int length = strlen(strBin);
cout << "Equivalent Decimal of given binary: " << bintoDecimal(strBin, length) << endl;
return 0;
}
ผลลัพธ์
Equivalent Decimal of given binary: 26