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 次查看

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告