天天看點

程式設計之美2.4擴充問題

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

}
           

繼續閱讀