同之前问题1的分析,二进制数1101十位为0,十位出现1的有11,10,111,110,1011,1010
推理若某位为0,则该位出现1的次数由高位数字(11)*当前位数(10即2^1)决定
二进制数1111十位为1,十位出现1的有11,10,111,110,1011,1010,1110,1111
推理若某位为1,则该位出现1的次数由高位数字(11)*当前位数(10即2^1)加上低位数字+1决定
#include<iostream>
using namespace std;
int NumOfOne(int n){
int iLowerNum=0;
int iCurrNum=0;
int iHigherNum=0;
int iFactor=1;
int iCount=0;
while(n/iFactor!=0)
{
iLowerNum=n-n/iFactor*iFactor;
iCurrNum=n/iFactor%2;
iHigherNum=n/(iFactor*2);
if(iCurrNum==0)
iCount=iHigherNum*iFactor;
else
iCount=iHigherNum*iFactor+iLowerNum+1;
iFactor*=2;
}
return iCount;
}
int main(){
cout<<NumOfOne(13)<<endl;
cout<<NumOfOne(15);
system("pause");
return 0;
}