C语言程序设计100例之(26):二进制数中1的个数
例26 二进制数中1的个数 问题描述 如果一个正整数m表示成二进制,它的位数为n(不包含前导0),称它为一个n位二进制数。所有的n位二进制数中,1的总个数是多少呢? 例如,3位二进制数总共有4个,分别是4(100)、5(101)、6(110)、7(111),它们中1的个数一共是1+2+2+3=8,所以所有3位二进制数中,1的总个数为8。 输入格式 一个整数T,表示输入数据的组数,接下来有T行,每行包含一个正整数 n(1<=n<=20)。 输出格式 对于每个n ,在一行内输出n位二进制数中1的总个数。 输入样例 3 1 2 3 输出样例 1 3 8 (1)编程思路1。 对于输入的n,n位二进制数m是位数为n并且首位为1的二进制数,且满足: 2 n-1 ≤ n位二进制数m < 2 n 因为首位为1,n位二进制数的个数就是n-1位的0和1的组合数,即2 n-1 个。 第1位必须为1,所以第1位的1的个数为2 n-1 个。 其他n-1位,总位数为(n-1)* 2 n-1 。其中0和1的个数是一半对一半,所以1的个数为(n-1)* 2 n-1 /2。 合计1的位数为:2 n-1 +(n-1)* 2 n-1 /2。 因此,n位二进制数中1的个数直接用上式计算出来。计算时,用移位运算来计算2的n次方是一种快速的计算方法。 即n位二进制数中1的个数为 :1<<(n-1)+