数字之魅 - 2.1

《编程之美》- 第二章节 - 数字之魅 - 2.1 - 求二进制数中1的个数 - 课后扩展问题解答 1 >>
如果变为32位的DWORD,显然使用解法四,五已经无法满足要求,
因为无法开辟这么大的数组空间,人为也不可能列举这么多的数,
来看解法一,二 ,算法的时间复杂度没有变,同样可以完美的解出,
来看解法三,时间复杂度依然只和1的个数有关,是最优的解法

2 >>
整数A和B的二进制表示中有多少位不同?
这里,首先想到,如果不同,这可以使用异或运算,然后问题就转化为求一个二进制数中1的个数,采用解法三可以很快算出来。
时间: 2024-08-24 07:20:35

数字之魅 - 2.1的相关文章

第2章 数字之魅——求二进制中1的个数

求二进制中1的个数 问题描述 对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能地高. [解法一] 可以举一个八位的二进制例子来进行分析.对于二进制操作,我们知道,除以一个2,原来的数字将会减少一个0.如果除的过程中有余,那么就表示当前位置有一个1. 以10 100 010为例: 第一次除以2时,商为1 010 001,余为0. 第二次除以2时,商为101 000,余为1. 因此,可以考虑利用整型数据除法的特点,通过相除和判断余数的值来进行分析.于是有了如下的

第2章 数字之魅——1的数目

1的数目 问题描述 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有"1"的个数. 例如: N= 2,写下1,2.这样只出现了1个"1". N= 12,我们会写下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12.这样,1的个数是5. 问题是: 1. 写一个函数f(N),返回1到N之间出现的"1"的个数,比如f(12)=5. 2. 在32位整数范围内,满足条件"f(N)= N&quo

第2章 数字之魅——不要被阶乘吓倒

不要被阶乘吓倒 问题描述 阶乘(Factorial)是个很有意思的函数,但是不少人都比较怕它,我们来看看两个与阶乘相关的问题: 问题1. 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0. 问题2. 求N!的二进制表示中最低位1的位置. 分析与解法 有些人碰到这样的题目会想:是不是要完整计算出N!的值?如果溢出怎么办?事实上,如果我们从"哪些数相乘能得到10"这个角度来考虑,问题就变得简单了. 首先考虑,如果N!= K×10

第2章 数字之魅——快速寻找满足条件的两个数

快速寻找满足条件的两个数 问题描述 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字,为了简化起见,我们假设这个数组中肯定存在这样一组或以上符合要求的解. 分析与解法 [解法一] 代码如下: 1 package chapter2shuzizhimei.findtwonumber; 2 /** 3 * 快速寻找满足条件的两个数 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class FindTowNumber1 { 9 //定义一个

数字之魅:快速寻找满足条件的两个数

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字,为了简化起见,我们假设数数组中肯定存在这样一组以上符合要求. 这个题目看起来其实并不难,但是仔细想想还是有许多值得思考的地方. 方案一:常人常规蛮力法.穷举法,需要找数据我们就挨个找,总是能找出来,就是时间问题,我么一次列举每一个数和后一个数的和看是否与目标值相等.但是其时间复杂度为O(N*N). 方案二:由于是查找,我们就可以对其进行排序操作,先排序再查找.为什么要排序呢?这里可以将问题转化一下?既然是寻找和为Sum的两个数

数字之魅:寻找数组中的最大值和最小值

数组是最简单的一种数据结构.我们经常碰到的一个基本问题,就是寻找整个数组中最大的数,或者最小的数.这时,我们都会扫描一遍数组,把最大(最小)的数找出来.如果我们需要同时找出最大和最小的数呢? 对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢? 这个题目比价简单,主要方案如下: 方案一:分别求最大和最小值.这是一种比较常规的解法.可以分别求出数组的最大值和最小值,这样,我们可以采用最基本的冒泡思想遍历两次(2N)就能求解. 方案二:分组求解.由于前面的需要遍历2N次.这里为

第2章 数字之魅——数字中的技巧

2.7最大公约数问题 问题:求两个数的最大公约数. 对于该问题:首先映入眼帘的就是两个数n m中寻找一个最小的值.然后从该值遍历到1.一旦 n%i==0&&m%i==0 那么i就是这个最大公约数啦.原理不言而喻.代码就不附上了. 之后一种就是比较经典的欧几里德算法.其中本质上的原理是这样的.gcd(n,m)表示n和m的最大公约数. 1:gcd(n,m) = gcd(n%m,m)  (n>m) 2:gcd(0,a) = a 这是合法的.因为0可以当做被除数(废话,但是为了严谨一点再次说

第2章 数字之魅——找符合条件的整数

找符合条件的整数 问题描述 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0. 解决这个问题首先考虑对于任意的N,是否这样的M一定存在.可以证明,M是一定存在的,而且不唯一.简单证明:因为 这是一个无穷数列,但是数列中的每一项取值范围都在[0, N-1]之间.所以这个无穷数列中间必定存在循环节.即假设有s,t均是正整数,且s<t,有 .于是循环节长度为t-s.于是10^s = 10^t.因此有:,所以 例如,取N=3,因为10的任何非负次方模3都为

第2章 数字之魅——子数组之和的最大值(二维)

子数组之和的最大值(二维) 问题描述 我们在前面分析了一维数组之和的最大值问题,那么如果是二维数组又该如何分析呢? 分析与解法 最直接的方法,当然就是枚举每一个矩形区域,然后再求这个矩形区域中元素的和. [解法一] 完整代码如下: 1 package chapter2shuzizhimei.maxsumsubarraytwodimensional; 2 /** 3 * 求数组的子数组之和的最大值(二维) 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public c