C++ 中計算除以 N 後商的 set bits 數小於除數的 set bits 數的除數個數


給定一個整數 N,將其視為除數,並用從 1 到 N 的數字除以它,任務是計算那些除數的個數,這些除數的 set bits 數大於除以給定數字 N 後的商的 set bits 數。

例如

輸入 - int N = 6

輸出 - 除以 N 後商的 set bits 數小於除數的 set bits 數的除數個數為:5

解釋 - 首先,我們將數字 N 除以從 1 到 N 的數字,並計算除數和商的 set bits 數,即

1-> N = 6 /1(1) = 6(2) = 1 < 2 = 不考慮

2-> N = 6 /2(1) = 3(2) = 2 = 2 = 考慮

3-> N = 6 /3(2) = 2(1) = 2 > 1 = 考慮

4-> N = 6 /4(1) = 1(1) = 1 = 1 = 考慮

5-> N = 6 /5(2) = 1(1) = 2 > 1 = 考慮

6-> N = 6 /6(2) = 1(1) = 2 >1 = 考慮

如我們所見,我們將考慮這些情況,輸出將為 5。

輸入 - int N = 10

輸出 - 除以 N 後商的 set bits 數小於除數的 set bits 數的除數個數為:8 

解釋 - 首先,我們將數字 N 除以從 1 到 N 的數字,並計算除數和商的 set bits 數,即

1-> N = 10 /1(1) = 10(2) = 1 < 2 = 不考慮

2-> N = 10 /2(1) = 5(2) = 2 = 2 = 考慮

3-> N = 10 /3(2) = 3(2) = 2 = 2 = 考慮

4-> N = 10 /4(1) = 2(1) = 1 < 2 = 不考慮

5-> N = 10 /5(2) = 2(1) = 2 > 2 = 考慮

6-> N = 10 /6(2) = 1(1) = 2 >1 = 考慮

7-> N = 10 /7(3) = 1(1) = 3 >1 = 考慮

8-> N = 10 /8(1) = 1(1) = 1 = 1 = 考慮

9-> N = 10 /9(2) = 1(1) = 2 > 2 = 考慮

10-> N = 10 /10(2) = 1(1) = 2 > 1 = 考慮

如我們所見,我們將考慮這些情況,輸出將為 8。

下面程式中使用的演算法如下

  • 輸入一個正整數 N,並將其作為引數傳遞給函式 divisors_quotient()。
  • 在函式 divisors_quotient() 內部
    • 返回 N - 對函式 set_quo(N) 的呼叫 + 1,並跳轉到函式 set_quo()
  • 在函式 set_quo() 內部
    • 建立一個名為 start 和 end 的臨時變數,並將 start 初始化為 1,end 初始化為 sqrt(N)。
    • 啟動迴圈 WHILE 直到 start < end,並建立一個名為 temp 的臨時變數,將其設定為 (start + end) / 2
    • 檢查 IF(對函式 verify() 的呼叫並傳遞 temp 和 N 作為引數),然後將 end 設定為 temp
    • 否則,將 start 設定為 temp + 1
    • IF(!對函式 verify() 的呼叫並傳遞 temp 和 N 作為引數),則返回 start + 1。
    • 否則,返回 start
  • 在函式 verify() 內部 
    • 檢查 IF(對函式 val_bit(temp/val) 的呼叫小於對函式 val_bit(val) 的呼叫),則返回 true,否則返回 False
  • 在函式 val_bit() 內部
    • 宣告一個名為 count 的臨時變數來儲存結果。
    • 啟動迴圈 WHILE val 有值。在迴圈內部,將 val 設定為 val / 2 並將 count 增加 1。
    • 返回 count。 

示例

線上演示

#include <bits/stdc++.h>
using namespace std;

int val_bit(int val) {
   int count = 0;
   while (val) {
      val = val / 2;
      count++;
   }
   return count;
}
bool verify(int val, int temp) {
   if (val_bit(temp / val) <= val_bit(val)) {
      return true;
   }
   return false;
}
int set_quo(int N) {
   int start = 1;
   int end = sqrt(N);
   while (start < end) {
      int temp = (start + end) / 2;
      if (verify(temp, N)) {
         end = temp;
      } else {
         start = temp + 1;
      }
   }
   if (!verify(start, N)) {
      return start + 1;
   } else {
      return start;
   }
}

int divisors_quotient(int N) {
   return N - set_quo(N) + 1;
}
int main() {
   int N = 10;
   cout << "Count of divisors having more set bits than quotient on dividing N are: " << divisors_quotient(N);
   return 0;
}

如果我們執行上述程式碼,它將生成以下輸出:

輸出

Count of divisors having more set bits than quotient on dividing N are: 8

更新於: 2021年1月29日

86 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告