【问题标题】:C - Print all numbers with same count of set and unset bitsC - 打印具有相同数量的设置和未设置位的所有数字
【发布时间】:2015-11-02 15:37:06
【问题描述】:

我必须打印最大N 位的数字,其中count of bits set to 1 = count of bits set to 0。我忽略了前导零。我认为这仅适用于位数为偶数的情况。

我的代码:

int power(k) {
   return 1 << k;
}


void print_numbers(int n){

   n      -= (n % 2); // FOR EVEN COUNT OF BITS
   int exp = 1; // EXPONENTS WILL BE ODD (2^1, 2^3, 2^5, ...)

   while (exp < n) {

       int start        = power(exp);
       int end          = power(exp + 1);
       int ones         = (exp + 1) / 2; // ALLOWED COUNT OF 1

       for (int i = start; i < end; i++) { 
          int bits_count = 0;

          for (int j = 0; j <= exp; j++){ // CHECK COUNT OF 1
             bits_count += ((i >> j) & 1);
          }
          if (bits_count == ones){
             printf("%d\n", i);
          }
       }
       exp += 2;
   }

对于N = 12,此函数打印 637 个数字。这个解决方案是正确的还是我错了?任何想法更有效或更好的解决方案?

【问题讨论】:

  • 看起来像codereview.stackexchange.com 的问题,假设代码有效。
  • 那么你是从最高位开始计算位长吗?换句话说,每个数字的第一位总是1吗?
  • @VladfromMoscow:他的意思是设置为1的位数等于设置为0的位数,比如11001100
  • MLN96:“每个数字都以 1 开头”是,恕我直言,比部分示例列表更清晰的陈述,似乎符合该简单描述,如下所示@Thomas 的问题 :)
  • 无论如何,如果您的意思是所有数字都以 1 开头,那么长度为 2k 的“平衡”数字的数量为 C(2k, k-1)(其中 C 是二项式函数),而 k 从 1 到 6 的 C(2k, k-1) 之和确实是 637。FWIW。

标签: c bit-manipulation bitwise-operators bit-shift bitwise-and


【解决方案1】:

我想出了这个,这是一种完全不同的方法(并且可以完善),但有效:

#include <stdio.h>

void checker(int number)
{
    int c;
    int zeros = 0;
    int ones = 0;

    for (c = 31; c >= 0; c--)
    {
        if (number >> c & 1) 
        {
            ones++;
        }
        else if(ones > 0)
        {
            zeros++;
        }
    }
    if(zeros == ones)
    {
        printf("%i\n", number);
    }
}

int main()
{
    int c;
    for (c = 4095; c >= 0; c--)
    {
        checker(c);
    }
    return 0;
}

这让我638 值(包括 0)

【讨论】:

    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多