用 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
廣告