C++中计算区间[0, n]内仅有一个设置位数字的个数
给定一个数字,任务是计算从0到给定数字(例如,num)的范围内,恰好只有一个设置位的数字的个数。
二进制数中的设置位用1表示。当我们计算整数的二进制数时,它是由0和1组合而成的。因此,数字1在计算机术语中被称为设置位。
输入 − int num = 15
输出 − 区间[0, 15]内仅有一个设置位的数字个数为4
解释 − 给定数字为15,因此范围是0-15。现在计算4位
二进制数为:
0 -> 0000 = 0个设置位, 1 -> 0001 = 1个设置位, 2 -> 0010 = 1个设置位, 3 -> 0011 = 2个设置位, 4 -> 0100 = 1个设置位, 5 -> 0101 = 2个设置位, 6 -> 0110 = 2个设置位, 7 -> 0111 = 3个设置位, 8 -> 1000 = 1个设置位, 9 -> 1001 = 2个设置位, 10 -> 1010 = 2个设置位, 11 -> 1011 = 3个设置位, 12 -> 1100 = 2个设置位, 13 -> 1101 = 3个设置位, 14 -> 1110 = 3个设置位, 15 -> 1111 = 4个设置位。现在,我们将选择恰好只有一个设置位的数字,它们是1、2、4和8。
输入 − int num = 4
输出 − 区间[0, 4]内仅有一个设置位的数字个数为3
解释 − 给定数字为4,因此范围是0-4。现在计算4位二进制数为:
二进制数为:
0 -> 0000 = 0个设置位, 1 -> 0001 = 1个设置位, 2 -> 0010 = 1个设置位, 3 -> 0011 = 2个设置位, 4 -> 0100 = 1个设置位。现在,我们将选择恰好只有一个设置位的数字,它们是1、2和4。
下面程序中使用的方法如下
解决这个问题有多种方法,例如:朴素方法和高效方法。那么,让我们首先看看**朴素方法**。
输入数字并将其传递给函数以进行进一步处理。
使用临时变量count来存储范围内设置位恰好为1的数字的个数。
从i=1开始循环到该数字。
在循环内,使用' __builtin_popcount(i)' 设置一个临时变量,该函数返回设置位的个数。
检查IF temp = 1,则递增计数。
返回计数。
打印结果。
高效方法
输入数字并将其传递给函数以进行进一步处理。
使用临时变量count来存储范围内设置位恰好为1的数字的个数。
从temp开始循环,直到temp <= 数字。
在循环内,将计数递增1并将temp设置为temp * 2。
返回计数。
打印结果。
示例(朴素方法)
#include <iostream> using namespace std; //function to Count of numbers having only 1 set bit in the range [0, n] int set_bits(int number){ int count = 0; for (int i = 1; i <= number; i++){ int temp = __builtin_popcount(i); if (temp == 1){ count++; } } return count; } int main(){ int number = 15; cout<<"Count of numbers having only 1 set bit in the range [0, "<<number<<"] are: "<<set_bits(number); return 0; }
输出
如果我们运行上述代码,它将生成以下输出:
Count of numbers having only 1 set bit in the range [0, 15] are: 4
示例(高效方法)
#include <iostream> using namespace std; //function to Count of numbers having only 1 set bit in the range [0, n] int set_bits(int number){ int count = 0; int temp = 1; while(temp <= number){ count++; temp = temp *2; } return count; } int main(){ int number = 15; cout<<"Count of numbers having only 1 set bit in the range [0, "<<number<<"] are: "<<set_bits(number); return 0; }
输出
如果我们运行上述代码,它将生成以下输出:
Count of numbers having only 1 set bit in the range [0, 15] are: 4