C - 打印具有相同设置位和未设置位的所有数字
C - Print all numbers with same count of set and unset bits
我必须打印最大 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 个数字。这个解决方案是正确的还是我错了?有没有更有效或更好的解决方案的想法?
我想到了这个,这是一种完全不同的方法(并且可以完善)但是有效:
#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 个)
我必须打印最大 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 个数字。这个解决方案是正确的还是我错了?有没有更有效或更好的解决方案的想法?
我想到了这个,这是一种完全不同的方法(并且可以完善)但是有效:
#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 个)