在 C++ 中检查数字 N 是否以 b 进制数 1 开头

c++server side programmingprogramming

我们有一个数字 N 和一个进制数 b。在这个程序中,我们必须检查数字是否以 b 进制数 1 开头。假设给出一个数字 6。在二进制中它是 110,所以它以 1 开头,在 4 进制中它也将是 124。这里它也以 1 开头。

众所周知,如果数字 N 以 b 进制数表示,b 将转换为 m+1 位序列 bm bm-1 … b0。这意味着 bm bm + bm-1 * bm-1 + … + b0*b0 = N。最大的数字将是 2*bm – 1。N 位于 bm ≤ N ≤ 2*bm – 1 之间。现在要注意的另一件事是 m 不能超过 $\lfloor\log_2 m\;\rfloor$,这是因为当我们用二进制表示任何数字时,它都会转换成只有 0 和 1 的序列,因此该序列的长度将始终大于任何其他基数表示,并且其长度等于$\lfloor\log_2 m\;\rfloor+1$。因此,要检查给定数字 N 是否以 1 为基数 b,我们将从 m = 1 遍历到 m =$\lfloor\log_2 m\;\rfloor$,并检查对于任何 m 值,N 是否在 bm ≤ N ≤ 2*bm – 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) //如果数字在给定范围内
   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

相关文章