同之前問題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;
}