摘要:
扩展问题:给定二进制数N,写下从1开始到N的所有二进制数,数一下其中出现的所有“1”的个数: f(1)=1 f(10)=10 (因为01,10,有两个1) f(11)=100 (因01,10,11,有四个1)解答:考虑f(1011):1,10,11,100,101,110,111,1000,1001,1010,1011 第一位上:高位数为101,每两个数就出现一个1,则出现101个1;且current位为1,低位数为0,所以5+1=6 第二位上:高位数为10,每四个数出现一个1,则出现(10)*2=4个1;且current位为1,... 阅读全文
摘要:
1、给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数?解法一:从1到N遍历,将每个数中含有“1”的个数加起来。。时间复杂度:O(n)*每个整数中“1”的个数复杂度=O(N*lgN)。。随着N增大,时间超越线性增长。。#include<iostream>using namespace std;int getNum(int n){ if(n==0) return 0; int num=0; while(n!=0) { num+=(n%10==1)?1:0; n/=10; } return nu... 阅读全文
摘要:
解法一:举例说明,为了减少复杂度,就使用八位二进制吧。设 A = 0010 1011, B = 0110 0101. 1. C = A & B = 0010 0001; 2. D = A | B = 0110 1111; 3. E = C ^ D = 0100 1110; 4. 结果E中有4个1,那么也就是说将A变成B,需要改变4位(bit)。 至于如何判断E的二进制表示中有几个1,可以采用快速移位与方法。 算法原理如下: 1. A & B,得到的结果C中的1的位表明了A和B中相同的位都是1的位; ... 阅读全文
摘要:
#include<iostream>using namespace std;/* Description: 解法一:求余法,时间复杂度O(lgn) 以10100010为例: 第一次除以2时,商为1010001,余数为0; 第二次除以2时,商为101000,余数为1; ...... 故,可以利用整形数据除法的特点,通过相除判断余数的值来分析。有如下代码: */int getNum1(int n){ if(n==0) return 0; int count=0; while(n) { if(n%2==1) { ... 阅读全文