Computer >> Máy Tính >  >> Lập trình >> C ++

Kiểm tra xem một số N có bắt đầu bằng 1 trong b-base trong C ++ hay không

Ta có một số N và một cơ số b. Trong chương trình này, chúng ta phải kiểm tra xem số có bắt đầu bằng 1 trong cơ số b hay không. Giả sử một số 6 được đưa ra. Trong hệ nhị phân, đây là 110, vì vậy nó bắt đầu bằng 1, trong cơ số 4 cũng sẽ là 12 4 . Ở đây nó cũng bắt đầu bằng 1.

Như chúng ta đã biết, nếu một số N được biểu diễn trong cơ số b, b sẽ được chuyển đổi thành m + 1 dãy bit bm bm-1… b0. Điều này ngụ ý b m b m + b m-1 * b m-1 +… + B 0 * b 0 =N. Số lớn nhất sẽ là 2 * b m - 1. Chữ N nằm trong b m ≤ N ≤ 2 * b m - 1. Một điều khác cần lưu ý là m không được vượt quá $ \ lfloor \ log_2 m \; \ rfloor $, điều này là do khi chúng ta biểu diễn bất kỳ số nào trong cơ số 2, nó sẽ được chuyển đổi thành một chuỗi chỉ có 0 và 1, vì vậy độ dài của dãy này sẽ luôn lớn hơn bất kỳ biểu diễn cơ sở nào khác và độ dài của nó sẽ bằng $ \ lfloor \ log_2 m \; \ rfloor + 1 $. Vì vậy, để kiểm tra một số nhất định N bắt đầu bằng 1 trong cơ số b hay không, chúng ta sẽ chuyển từ m =1 đến m =$ \ lfloor \ log_2 m \; \ rfloor $ và kiểm tra xem với bất kỳ giá trị nào của m, N nằm trong phạm vi b m ≤ N ≤ 2 * b m - 1 hoặc không và theo đó trả về True hoặc false.

Ví dụ

#include <iostream>
#include <cmath>
using namespace std;
bool isStartWithOne(int number, int base) {
   int m = log2(number);
   for (int i = 1; i <= m; i++) {
      if (number >= pow(base, i) && number <= 2 * pow(base, i) - 1) //if number is in the given range
   return true;
   }
   return false;
}
int main() {
int num = 19, base = 16;
   if(isStartWithOne(num, base)){
      cout << "Can be represented";
   }else{
      cout << "Can not be represented";
   }
}

Đầu ra

Can be represented