编程之美2.4扩展问题

来源:互联网 发布:淘宝账号密码大全 编辑:程序博客网 时间:2024/05/18 03:16


同之前问题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;elseiCount=iHigherNum*iFactor+iLowerNum+1;iFactor*=2;}return iCount;}int main(){cout<<NumOfOne(13)<<endl;cout<<NumOfOne(15);system("pause");return 0;}



原创粉丝点击