Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เข้ารหัสหมายเลขใน C++


สมมติว่าเรามีจำนวนเต็มที่ไม่เป็นลบ n และเราต้องหารูปแบบที่เข้ารหัสของมัน กลยุทธ์การเข้ารหัสจะเป็นดังนี้ -

หมายเลข หมายเลขที่เข้ารหัส
0 “”
1 “0”
2 “1”
3 ”00”
4 ”01”
5 ”10”
6 ”11”
7 ”000”

ดังนั้นหากตัวเลขคือ 23 ผลลัพธ์จะเป็น 1,000 หากตัวเลขคือ 54 จะเป็น 10111

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • สร้างเมธอดหนึ่งอันเรียกว่า bin ซึ่งจะใช้เวลา n และ k วิธีนี้จะทำหน้าที่ดังต่อไปนี้
  • res :=สตริงว่าง
  • ในขณะที่ n> 0
    • res :=res + ตัวเลขของ n mod 2
    • n :=n /2
  • ย้อนกลับจำนวนความละเอียด
  • ในขณะที่ x> ความยาวของความละเอียด
    • res :=เติม 0 ด้วย res
  • ผลตอบแทน
  • วิธีที่แท้จริงจะเป็นดังนี้ -
  • ถ้า n =0 ให้คืนค่าสตริงว่าง ถ้า n เป็น 1 ให้คืนค่า "0" หรือเมื่อ n เป็น 2 ให้คืนค่า "1"
  • x :=บันทึก n ฐาน 2
  • ถ้า 2 ^ (x + 1) – 1 =n แล้ว
    • ans :=สตริงว่าง
    • เพิ่ม x ขึ้น 1
    • ในขณะที่ x ไม่ใช่ 0 ดังนั้น ans :=ให้เติม 0 ด้วย ans และเพิ่ม x ขึ้น 1
    • คืนสินค้า
  • ถังส่งคืน(n – 2^x + 1, x)

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string bin(int n, int x){
      string result = "";
      while(n>0){
         result += (n%2) + '0';
         n/=2;
      }
      reverse(result.begin(), result.end());
      while(x>result.size())result = '0' + result;
      return result;
   }
   string encode(int n) {
      if(n == 0)return "";
      if(n == 1)return "0";
      if(n==2) return "1";
      int x = log2(n);
      if(((1<<(x+1)) - 1) == n){
         string ans = "";
         x++;
         while(x--)ans+="0";
         return ans;
      }
      return bin(n - (1<<x) + 1, x);
   }
};
main(){
   Solution ob;
   cout << (ob.encode(23)) << endl;
   cout << (ob.encode(56)) << endl;
}

อินพุต

23
54

ผลลัพธ์

1000
11001