ในปัญหานี้ เราได้รับหมายเลข N หน้าที่ของเราคือสร้างโปรแกรมเพื่อ พิมพ์ตัวเลขเป็นสตริงของ 'A' และ 'B' ตามลำดับพจนานุกรม
การแสดงตัวเลขทั้งหมดเป็นสตริงของ 'A' และ 'B' คือ
1 =อา
2 =ข
3 =AA
4 =AB
5 =BA
6 =บีบี
7 =AAA
8 =AAB
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล: ไม่มี =12
ผลลัพธ์: แบ๊บ
แนวทางการแก้ปัญหา
สตริงของ 'A' และ 'B' คล้ายกับเลขฐานสอง ในการหาสตริง เราจะหาความยาวของสตริงก่อน โดยใช้ข้อเท็จจริงว่ามีตัวเลข 2 ตัวยาว 1 (ถึงขนาด 2), 4 ตัวยาว 2 (ถึงขนาด 6), 8 ตัวยาว 3 (ยาวถึงขนาด) 14). หลังจากหาความยาวแล้ว เราก็ต้องหาตัวอักษรของสตริง โดยการอัปเดตความยาวที่เหลืออยู่ซ้ำๆ เมื่อเราเพิ่มตัวเลขลงในสตริง อักขระจะพิจารณาจากการเปรียบเทียบ N กับ (2^(ความยาวที่เหลือ)) ถ้า N น้อยกว่าอักขระปัจจุบันคือ 'B' มิฉะนั้น อักขระนั้นจะเป็น 'A' หลังจากการวนซ้ำแต่ละครั้ง เราจะลดความยาวลง 1 และหากอักขระเป็น 'B' จะอัปเดต N และลดความยาวลง num
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream> #include<math.h> using namespace std; int findStringLength(int M) { int stringLen = 1; while((pow(2, stringLen + 1) - 2) < M) { stringLen++; } return stringLen; } void printNumString(int N) { int stringLen, num, stringNumber; stringLen = findStringLength(N); stringNumber = N - (pow(2, stringLen) - 2); while (stringLen) { num = pow(2, stringLen - 1); if (num < stringNumber) { cout<<"B"; stringNumber -= num; } else { cout<<"A"; } stringLen--; } } int main() { int N = 47; cout<<"The number as sting of 'A' and 'B' in lexicographic order is "; printNumString(N); return 0; }
ผลลัพธ์
The number as sting of 'A' and 'B' in lexicographic order is BAAAA