获取N的二进制中1的个数
最简便解法,直接用n与(n-1)进行与操作,直到n=0,程序复杂度只与1的个数有关
void getBinOneNum(int n) {
/*获取n二进制中1的个数*/
int count = 0;
while (n)
{
n &= (n - 1);
count++;
}
cout << count;
}
获取小于等于N正整数中1的数目:
规律为:求当前位的高位,低位和位数
当前位=0:个数=高位*10^位数
当前位=1:个数=高位*10^位数+低位+1
当前位>1:个数=(高位+1)10^*位数
累加即可得到结果
void getOneNum(int N) {
//获得小于等于N的所有1出现的个数
unsigned long long icount = 0; //1的位数统计
unsigned long long iFactor = 1; //10的位数次方
unsigned long long iLowerNum = 0; //低位
unsigned long long iHeigherNum = 0; //低位
unsigned long long iCurrNum = 0; //当前位
while (N / iFactor) {
iLowerNum = N - (N / iFactor)*iFactor;
iHeigherNum=N / (iFactor * 10);
iCurrNum = (N / iFactor) % 10;
switch (iCurrNum)
{
case 0:
icount += iHeigherNum*iFactor;
break;
case 1:
icount += iHeigherNum*iFactor + iLowerNum + 1;
break;
default:
icount += (iHeigherNum + 1)*iFactor;
break;
}
iFactor *= 10;
}
cout << icount;
}