我们有一个数字N和一个底数b。在此程序中,我们必须检查数字是否以b开头的数字为1。假设数字为6。在二进制中它是110,所以它从1开始,在基数4中也将是12 4。这也是从1开始。
众所周知,如果在底数b中表示一个数字N,则b将转换为m + 1位序列bm bm-1…b0。这意味着b米b米+ B M-1 * B M-1 + ... + B 0 * B 0 = N.最大数量将是2 * B米- 1的N-在于b米≤N≤2 * b米– 1.现在要注意的另一件事是m不能超过$\ lfloor \ log_2 m \; \ rfloor $,这是因为当我们在base-2中表示任何数字时,它将转换为仅0和1s的序列,因此此序列的长度将始终大于任何其他基本表示形式,并且其长度将等于$\ lfloor \ log_2 m \; \ rfloor + 1 $。因此,要检查给定的数字N是否以b开头的1,我们将从m = 1遍历到m = $\ lfloor \ log_2 m \; \ rfloor $并检查是否有m的任何值,N位于范围b米≤N≤2 * b米- 1或不是,并相应地返回真或假。
#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