Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 b-base에서 숫자 N이 1로 시작하는지 확인하십시오.

<시간/>

숫자 N과 밑수 b가 있습니다. 이 프로그램에서는 숫자가 b진법에서 1로 시작하는지 여부를 확인해야 합니다. 숫자 6이 주어졌다고 가정합니다. 바이너리에서는 110이므로 1로 시작하고 4진법에서도 124가 됩니다. . 여기에서도 1로 시작합니다.

우리가 알다시피, 숫자 N이 밑수 b로 표현되면 b는 m+1 비트 시퀀스 bm bm-1 … b0으로 변환됩니다. 이것은 bm를 의미합니다. b m + bm-1 * b m-1 + ... + b0 *b 0 =N. 가장 큰 수는 2*b m 입니다. – 1. N은 b m 에 있습니다. ≤ N ≤ 2*b m – 1. 이제 주목해야 할 또 다른 사항은 m이 $\lfloor\log_2 m\;\rfloor$를 초과할 수 없다는 것입니다. 이는 2진법에서 임의의 숫자를 나타낼 때 0과 1의 시퀀스로만 변환되기 때문입니다. 이 시퀀스의 길이는 항상 다른 기본 표현보다 크며 그 길이는 $\lfloor\log_2 m\;\rfloor+1$ 와 같습니다. 따라서 주어진 숫자 N이 b 밑수에서 1로 시작하는지 확인하기 위해 m =1에서 m =$\lfloor\log_2 m\;\rfloor$로 순회하고 m의 값에 대해 N이 있는지 확인합니다. 범위 b m ≤ N ≤ 2*b m – 1 여부에 따라 True 또는 False를 반환합니다.

예시

#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";
   }
}

출력

Can be represented