返回

刷题日记:762. 二进制表示中质数个计算置位,让编程成为一种乐趣!

后端

大家好,我是[你的名字],欢迎来到我的刷题日记!今天,我们将一起解决 LeetCode 上的 762. 二进制表示中质数个计算置位。

题目

给定一个整数 n,请计算其二进制表示中质数个计算置位(1)的数量。

示例 1:

输入:n = 31
输出:3
解释:31 的二进制表示为 "11111",其中有三个质数个计算置位。

示例 2:

输入:n = 10
输出:2
解释:10 的二进制表示为 "1010",其中有两个质数个计算置位。

思路与解法

为了解决这个问题,我们可以使用以下步骤:

  1. 将整数 n 转换为二进制字符串。
  2. 遍历二进制字符串中的每个字符。
  3. 如果当前字符为 '1',则检查其位置是否为质数。
  4. 如果是质数,则增加质数个计算置位的数量。
  5. 重复步骤 2 和 3,直到遍历完整个二进制字符串。

代码实现

下面是使用 C++ 实现的代码:

#include <iostream>
#include <cmath>

using namespace std;

int countPrimeSetBits(int n) {
  // 将整数 n 转换为二进制字符串
  string binary = "";
  while (n > 0) {
    binary = (n % 2 == 0 ? '0' : '1') + binary;
    n /= 2;
  }

  // 遍历二进制字符串中的每个字符
  int count = 0;
  for (char c : binary) {
    // 如果当前字符为 '1',则检查其位置是否为质数
    if (c == '1') {
      int position = binary.length() - 1 - (c - '0');
      if (isPrime(position)) {
        count++;
      }
    }
  }

  return count;
}

bool isPrime(int n) {
  if (n <= 1) {
    return false;
  }

  for (int i = 2; i <= sqrt(n); i++) {
    if (n % i == 0) {
      return false;
    }
  }

  return true;
}

int main() {
  int n;
  cout << "输入一个整数 n:";
  cin >> n;

  int count = countPrimeSetBits(n);
  cout << "二进制表示中质数个计算置位数量为:" << count << endl;

  return 0;
}

下面是使用 Python 实现的代码:

def countPrimeSetBits(n):
  # 将整数 n 转换为二进制字符串
  binary = bin(n)[2:]

  # 遍历二进制字符串中的每个字符
  count = 0
  for c in binary:
    # 如果当前字符为 '1',则检查其位置是否为质数
    if c == '1':
      position = len(binary) - 1 - int(c)
      if isPrime(position):
        count += 1

  return count

def isPrime(n):
  if n <= 1:
    return False

  for i in range(2, int(sqrt(n)) + 1):
    if n % i == 0:
      return False

  return True

n = int(input("输入一个整数 n:"))
count = countPrimeSetBits(n)
print("二进制表示中质数个计算置位数量为:", count)

总结

通过解决这道题目,我们不仅学习了如何计算一个整数的二进制表示中质数个计算置位数量,而且还巩固了我们对二进制、质数和字符串等概念的理解。希望这个刷题日记对大家有所帮助,也欢迎大家在评论区留言交流。