用 C++ 检查一个 b 进制数 N 是否以 1 开头


我们有一个数字 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$,这是因为当我们将任何数字用 2 进制表示时,它会转换为仅包含 0 和 1 的序列,因此此序列的长度将始终大于任何其他基数表示的长度,并且其长度将等于 $\lfloor\log_2 m\;\rfloor+1$。因此,要检查给定的数字 N 是否以 b 进制下的 1 开头,我们将从 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) //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

更新于:2019年9月27日

浏览量:126

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.