穷举及其优化
算法——穷举法

算法——穷举法穷举法是一种常见的求解问题的算法,也被称为暴力搜索或者暴力枚举。
它的基本思想是穷尽所有可能的情况,从中找出满足问题要求的最优解或者符合条件的解。
在实际问题中,穷举法可以解决很多难题,比如寻找最短路径、最小值、最大值等等。
穷举法的求解过程相对容易理解,而且实现起来很简单。
但是,随着问题规模的增加,穷举法的时间复杂度会非常高,计算机的计算能力往往无法承载。
因此,在使用穷举法时,需要掌握一些技巧有效地减少计算量。
穷举法基本步骤:1.确定问题的解空间解空间是指可以取到的所有解组成的集合。
需要明确问题的解空间,方便穷举法从中查找到符合条件的解。
例如,对于求1~100中所有偶数的和这个问题,解空间就是所有偶数的集合{2,4,6,...,100}。
2.确定问题的约束条件约束条件是指解必须满足的限制条件。
例如,对于求1~100中所有偶数的和这个问题,约束条件就是偶数。
3.进行穷举搜索穷举搜索就是从解空间中挨个枚举每一个解,判断是否满足约束条件。
对每一组解都进行判断,找到满足要求的最优解或者符合条件的解。
例如,在求1~100中所有偶数的和这个问题中,需要从所有偶数中挨个枚举每一个偶数,将其累加到结果变量中。
4.分析求解结果分析求解结果,检验是否符合问题的要求。
如果结果合法,那么就是要求的最优解或者符合条件的解。
如果结果不合法,那么需要继续搜索其他可能的解。
穷举法的优缺点优点:1.穷举法可以求解各种难点问题,尤其是在面对离散的问题时效果非常显著。
2.穷举法思路简单,易于理解,实现也相对较简单。
3.穷举法保证能够搜索到所有可能的解,因此能够找到最优解或者符合条件的解。
1.穷举法遍历所有可能的解,当问题规模较大时,时间复杂度非常高,计算量大,效率低。
2.部分问题的解空间很难找到或没有固定的解空间,导致穷举策略无从下手。
3.穷举法没有明确的评估标准,求得的解无法与其他算法进行比较。
穷举法使用技巧1.剪枝技术穷举法的时间复杂度往往比较高,因此需要使用剪枝技术,减少不必要的计算。
第五讲 穷举算法

第五讲穷举算法学习重点:1、了解穷举法的基本概念及用穷举法设计算法的基本过程。
2、能够根据具体问题的要求,使用穷举法设计算法,编写程序求解问题。
3、能对穷举法编写的程序进行优化学习过程:穷举算法是学生在学完了QB基本语句后最早接触到的算法。
一些简单的穷举算法题目如求水仙花数、找出缺失的数字等和小学生的数学学习紧密结合,程序也比较容易实现,因此学生的学习兴趣还是很高的。
近几年的省小学生程序设计竞赛中也常出现穷举算法的题目,如:2001年题四算24;2002年题三求素数个数与素数个数最多的排列;2005年回文数个数等题目,有些题虽然说用穷举算法实现比较勉强(如2002年题三的后半题求出素数个数最多的排列),但在考试时,如果一时想不出更好的办法,用穷举算法也不失为一种明智的选择。
穷举法,常常称之为枚举法,是指从可能的集合中一一穷举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。
能使命题成立者,即为问题的解。
穷举是最简单,最基础,也是通常被认为非常没效率的算法,但是。
穷举拥有很多优点,它在算法中占有一席之地。
首先,穷举具有准确性,只要时间足够,正确的穷举得出的结论是绝对正确的;其次,穷举拥有全面性,因为它是对所有方案的全面搜索,所以,它能够得出所有的解。
采用穷举算法解题的基本思路:(1)确定穷举对象、穷举范围和判定条件;(2)一一列举可能的解,验证是否是问题的解一、穷举算法的实现在前面基础语句(for语句)的学习中,其实我们就用到了穷举。
比如培训教材p77【例5-7】打印九九乘法表中,被乘数A和乘数B都从1-9一一列举。
这样,九九乘法表中就不会遗失任何一句乘法口诀;在p79【例5-9】的数学灯谜题中,我们也是用了一一列举的方法,找出了A、B、C、D的取值范围。
下面我们再看两道例题:1、搬运砖头【问题描述】36 块砖, 36 人搬。
男搬 4 ,女搬 3 ,两个小儿抬一砖。
要求一次全搬完。
问需男、女、小儿各若干?【问题分析】题目要我们找出符合条件的男生、女生和小孩的人数。
高中信息技术《用穷举法解决问题》优质教案、教学设计

《用穷举法解决问题》教学设计工作单位:授课老师:课型:新授课学科:信息技术一、教学内容分析本节课是《算法与程序设计》(教育科学出版社2004 版选修本)第三章“算法的程序实现”中第二节“用穷举法解决问题”的内容。
穷举法是程序设计中使用最为普遍的一种基础算法。
它利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检查,从中找出符合要求的答案。
穷举法的基本结构为For......Next 语句+if ....... then 条件判断的应用,该知识点在第二章《程序的基本结构》中已经学过,而且穷举法对后面的排序、查找和递归等算法的学习也具有示范和引领作用。
通过本节课的学习让学生理解穷举法的思想,掌握穷举法解决问题集的基本过程,以及常用的优化方法。
二、学情分析本节课的教学对象是高二年级的学生,他们已具有一定的分析能力、抽象思维能力和逻辑推理能力,并且此之前学习了用流程图描述算法、VB 的数据表示和处理、程序的三大结构以及解析法,能用VB 编写简单的程序。
今天学习穷举法其实学生在前面的循环语句学习中已经用到这种思想,只不过没有给学生提出穷举法这个概念,现在从算法这个角度把这个概念提出来,让学生理解穷举法的思想,掌握枚举算法的使用范围、解题步骤和程序框架、能用穷举法解决问题并能根据具体问题对穷举法进行优化。
因此本节课的教学目标是:第一,能用穷举法对问题进行分析及设计算法;第二,能根据分析补充程序的关键部分;第三,能合理的进行算法优化。
三、教学目标1、知识与技能:(1)了解穷举法的基本概念;(2)能归纳出穷举法解决问题的方法和步骤;(3)能根据具体条件优化穷举算法;2、过程与方法:(1)掌握穷举法求解问题的基本过程。
(2)在学习过程中,发现穷举法的规律,并把它运用实际问题的解决中去。
(3)针对解决问题的过程与结果进行有效的评价。
3、情感态度价值观:(1)关注穷举法在社会生活中的应用,激发学习的热情。
Python算法学习_穷举

Python算法学习_穷举穷举算法是一种通过枚举所有可能的解决方案来解决问题的算法。
它通常适用于问题规模较小,且所有可能的解决方案数量不会过大的情况。
穷举算法的优势是简单直观,并且能够找到所有可能的解决方案。
穷举算法的核心思想是通过遍历所有可能的解决方案,找到满足问题条件的解。
在Python中,可以使用循环结构实现穷举算法。
下面以一个具体的例子来说明穷举算法的应用。
假设有一个问题:从1,2,3,...,9这9个数字中选取3个数字,使其和等于一些给定的目标值。
首先,可以使用三层嵌套的循环来遍历所有可能的解决方案:```for i in range(1, 10):for j in range(1, 10):for k in range(1, 10):if i + j + k == 目标值:print(i, j, k)```在上述代码中,`range(1, 10)`用于生成1到9的数字序列,`i`、`j`和`k`分别代表选取的三个数字。
通过遍历这三个数字的所有可能排列组合,判断其和是否等于目标值,如果等于则输出这三个数字。
需要注意的是,上述代码中的循环变量范围可以根据实际情况进行调整。
比如,如果题目要求选取4个数字使其和等于目标值,那么就需要增加一个循环变量和对应的嵌套循环。
穷举算法的时间复杂度取决于解空间的大小。
在上述例子中,由于数字的范围是1到9,因此解空间的大小为9的三次方,即729种可能的解决方案。
因此,上述代码的时间复杂度为O(729)。
如果数字范围更大,解空间的大小就更大,穷举算法的时间复杂度也会随之增加。
另外,穷举算法还可能存在优化的空间。
例如,在上述例子中,可以根据问题的特点进行剪枝优化,减少不必要的计算。
具体来说,在第一个循环中选取的数字大于目标值减去后两个数字之和时,就可以停止循环,因为后面的数字不可能满足条件。
综上所述,穷举算法是一种简单直观且有效的算法,适用于问题规模较小且解空间不会过大的情况。
穷举,选代,递推的使用方法

"穷举"、"选代"和"递推"是三种不同的方法,通常在不同的数学或计算问题中使用。
以下是对这三种方法的详细解释:1. 穷举(Exhaustive Enumeration):▪定义:穷举是一种通过逐个尝试所有可能的情况来解决问题的方法。
在这种方法中,系统性地列举所有可能的解,然后检查哪一个满足给定的条件。
▪使用场景:穷举通常用于解决相对较小且离散的问题,其中可能的解的数量是有限的。
这种方法在保证完备性的同时,可能会因为遍历所有可能性而效率较低。
2. 选代(Iteration):▪定义:选代是通过迭代或循环的方式逐步逼近解决问题的方法。
它通常包括多次迭代,每一次迭代都在先前的结果基础上进行调整,直至达到满足条件的解。
▪使用场景:选代常常用于需要逐步调整和逼近的问题,例如数值计算、优化问题等。
选代方法可以通过不断改进当前解决方案来逐渐接近最优解。
3. 递推(Recursion):▪定义:递推是一种通过在问题中使用相同的解决方法,但在较小的规模上进行的方法。
递推问题通常将大问题拆解为较小的子问题,并通过解决子问题来解决原始问题。
▪使用场景:递推经常用于解决具有递归结构的问题,例如分治算法、动态规划等。
递推关注的是将问题划分为可重复解决的子问题,然后将这些解决方案合并以解决原始问题。
示例:▪穷举:在密码破解中,穷举法会尝试所有可能的密码组合,直到找到正确的密码。
▪选代:在求解方程或最优化问题时,使用迭代方法,每一次迭代都尝试使解更接近真实解。
▪递推:在斐波那契数列中,递推公式为 F(n) = F(n-1) + F(n-2),利用相邻两项的关系递推计算出数列的值。
这三种方法都有其适用的场景和优劣势,选择使用哪种方法通常取决于问题的性质和规模。
在实际应用中,很多问题可能会结合使用这些方法的不同特点来更有效地解决。
信息奥赛—穷举

完全数
古希腊人认为因子的和等于它本身的数是一个完全数 (自身因子除外),例如28的因子是1、2、4、7、14 ,且1+2+4+7+14=28,则28是一个完全数,编写一个 程序求2~1000内的所有完全数。
Program p3_1 ; Var a , b,s :integer ; Begin For a:=2 to 1000 do Begin S:=0 ; For b:=1 to a -1 do If a mod b =0 then s:=s+b ; { 分解因子并求和 } If a=s then begin Write( a, ‘=’ ,1, ); For b:=2 to a -1 do If a mod b=0 then write( ’+’, b ); Writeln ; End; End; End.
穷 举
OicqPassOver这个工具可以用来探测QQ 的口令,它根据机器性能最高可以每秒测试 20000个口令,如果口令简单,一分钟内, 密码就会遭到破译。
这些密码破译软件通常就是用的
穷举算法。
穷举的策略应该是直接基于计算机 特点而使用的思维方法,在一时找不 到解决问题的更好途径(比如数学公 式或规律规则)时,可以根据问题中 的部分(约束)条件,将可能解的情 况列举出来,然后一一验证是否符合 整个问题的求解要求。
实例:编一个程序找出三位数到七位数中所 有的阿姆斯特朗数。阿姆斯特朗数也叫水仙花数, 它的定义如下:若一个n位自然数的各位数字的n 次方之和等于它本身,则称这个自然数为阿姆斯 特朗数。例如153(153=1*1*1+3*3*3+5*5*5) 是一个三位数的阿姆斯特朗数,8208则是一个四 位数的阿姆斯特朗数。
拓展知识5-1 穷举法

拓展知识5-1 穷举法一、什么是穷举法在实际问题中,经常遇到在一定范围内寻求某类事物解的问题。
比如:求水仙花数,因为水仙花数是一个三位数,所以,[100,999]就是给定的范围,水仙花数就是要求的解;又如:百马百担问题,求解决方案,大马数量[1,33],中马数量[1,50],小马数量[1,100] 就是给定的范围,解决方案就是要求的解等。
像这类问题,可以通过对指定范围内每种可能的情况进行一一测试,验证其是否是满足条件的解的方法来解决,我们就把这种解决问题的方法称为穷举法。
由于实际问题的指定范围可能很大,所以,穷举法更适合于使用计算机,因此,这类问题可通过程序设计来解决。
二、穷举法解决问题的关键1.确定范围(1)往往实际问题给定的范围不一定很明确,需要我们通过分析来确定范围;(2)所得到的范围还可以利用给定的部分约束条件进一步缩小,以减少程序的运行时间,提高效率。
2.确定解的条件通过对实际问题进行分析,给出判断解的条件,有了判断解的条件才能对每种可能的情况进行一一验证,从而得到问题的解。
三、穷举法解决问题的步骤1.分析问题,确定范围变量,给出解的判断条件;2.用循环或循环的嵌套对范围变量的所有可能情况进行一一测试;3.用选择语句判断每种情况是否符合解的条件;4.输出符合条件的情况。
四、穷举法的优化策略1.减少范围变量范围变量能少用尽量少用,这样可大大减少测试的数量。
例如百马百担问题,对大马、中马、小马均可设一个范围变量dm、zm、xm,其范围分别是:[1,33],[1,50],[1,100],总的测试数量为33*50*100=165000次;在大马、中马具体确定后,小马可利用约束条件dm+zm+xm=100来确定,因此,只需将大马、中马设为范围变量,这样测试数量为33*50=1650次。
可见,减少范围变量的使用可大大减少测试的数量。
2.缩小穷举范围根据实际问题的隐含条件,可将不符合条件的情况去掉,缩小穷举范围,减少穷举变量的值域。
穷举算法

分析
• 这是1998年全国分区联赛普及组试题(简称 NOIP1998pj,以下同)。此题数据规模不大, 可以进行枚举,如果我们不加思地以每一个数 位为枚举对象,一位一位地去枚举: for a:=1 to 9 do for b:=1 to 9 do ……… for i:=1 to 9 do • 这样下去,枚举次数就有99次,如果我们分别 设三个数为x,2x,3x,以x为枚举对象,穷举的 范围就减少为93,在细节上再进一步优化, 枚举范围就更少了。
使用穷举的条件
• 可预先确定解的个数n • 解变量a1、a2、an的可能值为一个连续 的值域
算法归纳
• • • • • •
• • • • • • • •
设:ai1-----解变量ai的最小值,aik----解变量ai的最大值(1《=i〈=n) a11<=a1<=a1k a21<=a2<=a2k ai1<=ai<=aik an1<=an<=ank 我们称解变量为穷举变量,即解题过程中需要列举出的变量(很明显,要列举出 变量的每个值,我们一般都使用for循环) 例如某问题的穷举变量有三个:a1,a2,a3,其中1〈=a1〈=2;2〈=a2〈=4;5 〈=a3〈=7 则可以列出本问题的所有可能解共18组(略) 在上述可能解的集合中,满足问题给定的检验条件的解元素就是问题的可能解 for a1:=a11 to a1k do for a2:=a21 to a2k do for a3:=a31 to a3k do for an:=an1 to ank do if (a1.a2.ai,an)满足检验条件 then 输出问题的解(a1,a2,ai,an)
•
(CHN,ENG) (CHN,FRH) (CHN,JPN) ( ENG,FRH) ( ENG,JPN)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 如 153(153=1*1*1+3*3*3+5*5*5) 是一个三位数的阿姆斯特朗数,8208则是一个四位 数的阿姆斯特朗数。
算法分析:
为了使得程序尽快运行出正确结果,程序中使 用了一个数组power存放所有数字的各次幂之值, power[i,j] 等 于 i 的 j 次 方 。 变 量 currentnumber存放当前要被验证的数,数组 digit 存 放 当 前 数 的 各 位 数 字 , 开 始 时 digit[3]=1,其它元素均为0,此时表示当前数为 100。 highest为当前数的位数。
问题分析
直接穷举,因为数据较大显然不能达到 目的,由于本题本质上是求全排列,这里用 生成法求全排列比较合适。
read(n); read(m); for i:=1 to n do read(a[i]); t:=0; a[0]:=0; while a[0]=0 do begin j:=n; while a[j]<a[j-1] do j:=j-1; mini:=j;min:=a[j]; for i:=j to n do if (a[i]>a[j-1]) and (a[i]<min) the begin
B8
优化思路:分解约束条件,将拆分的约束条 件嵌套在相应的循环体间,尽可能减少可行解 的数目,也称为“剪枝”,即把明显不符合条 件的可行解尽可能地剪去,减少穷举的计算量。
六、实例分析:
例7、巧妙填数。 问题描述:将1~9这九个数字填入九个空格中。 每一横行的三个数字组成一个三位数。如果要使第 二行的三位数是第一行的两倍,第三行的三位数是 第一行的三倍,应怎样填数。如图所示。
LINK 1 1 2 1 3 1 4 2 5 2 6 2 7 3 …… 13 6 14 7
2 3 4 3 5 6 4 7 8
表中表示哪两个格子是相邻的,link[i,1]和 link[i,2]是相邻的格子的编号。全排列的产生,可 以用八重循环,也可以用构造的算法,程序留给同学 们自己去完成。利用穷举策略编制的程序,其运算量 一般是很大的,因此如何提高算法效率是穷举算法一 个很重要的问题。一般应尽量减少可行解的个数,使 得第二步的检验运算量尽可能地少。
1 3 5
9 8 7
2 4 6
分析:本题目有9个格子,要求填数,如果不考虑 问题给出的条件,共有9!=362880种方案,在 这些方案中符合问题条件的即为解。因此可以采用 穷举法。 但仔细分析问题,显然第一行的数不会超过400, 实际上只要确定第一行的数就可以根据条件算出其 他两行的数了。这样仅需穷举400次。
分析:枚举对象为x和y,范围如何? 仔细观察1/12=1/156+1/13 可以看 出来,x可以比y大很多。Y是有一定范围的。
通过不等式变形:
1 1 1 1 1 x y,有 ,因此 ,即y 2k x y k y y
显然,只需在2k范围内枚举y,然后 根据y尝试计算出x即可。
例6、方格填数。 问题描述:如图所示的8个格子中放入1~ 8八个数字,使得相邻的和对角线的数字之 差不为1。编程找出所有放法。
a[0] 0
0 0 0
a[1], 1
1 1 2
a[2] 2
2 3 3
a[3] 3
4 4 4
生成的组 合 3
3 3
7
7
12
19
1
2
3
4
12 19 7 12 19 循环结束
② 判断一个整数是否为素数 判断一个整数P(P>1)是否为素数最简单的方法就是 看是否存在一个素数a(a<=sqrt(P))是P的约数,如果 不存在,该数就为素数。由于在此题中 1<=xi<=5000000,n<=20,所以要判断的数P不会超 过100000000,sqrt(p)<=10000,因此,为了加快速 度,我们可以用筛选法先将2…10000之间的素数保 存到一个数组里(共1229个),这样速度估计将提 高许多。
程序: const maxlen=7; var i,j,currentnumber,highest,sum,total:longint; digit:array [0..maxlen+1] of integer; power:array [0..9,0..maxlen] of longint; begin for i:=0 to 9 do begin power[i,0]:=1; for j:=1 to maxlen do power[i,j]:=power[i,j-1]*i end;
var x,y:integer; begin for x:=10 to 99 do {枚举除数x,范围是 10~99} begin y:=809*x+1; {计算出被除数y} if y>9999 then break; if (y>=1000) and (8*x<=99) and (9*x>=100) then writeln(y,' ',x);{验证,如果 满足要求,则输出} end; end.
穷举及其优化
泰州二附中 谢志锋
例1、一个火星人用一个人类的手演示了如何用 手指计数。如果把五根手指——拇指、食指、中指、 无名指和小指分别编号为1,2,3,4和5,当它们按 正常顺序排列时,形成了5位数12345,当你交换无 名指和小指的位置时,会形成5位数12354,当你把 五个手指的顺序完全颠倒时,会形成54321,在所有 能够形成的120个5位数中,12345最小,它表示1; 12354第二小,它表示2;54321最大,它表示120。 下表展示了只有3根手指时能够形成的6个3位数和它 们代表的数字: 三进制数 123 132 213 231 312 321 代表的数字 1 2 3 4 5 6
end.
例5:分数拆分 输入正整数k,找到所有的正整数x≥y, 使得 1 1 1
k x y
样例输入: 2 12 样例输出 2 1/2=1/6+1/3 1/2=1/4+1/4
12 1/12=1/156+1/13 1/12=1/84+1/14 1/12=1/60+1/15 1/12=1/48+1/16 1/12=1/36+1/18 1/12=1/30+1/20 1/12=1/28+1/21 1/12=1/24+1/24
min:=a[i];mini:=i; end; temp:=a[mini]; a[mini]:=a[j-1]; a[j-1]:=temp; for x:=j to n-1 do for y:=j+1 to n do if a[x]>a[y] then begin temp:=a[x]; a[x]:=a[y]; a[y]:=temp; end; t:=t+1; if t=m then break; end;
begin
i:=1;
while digit[i]=10 do digit[i+1]:=digit[i+1]+1; digit[i]:=0; i:=i+1 end;
进位
if i>highest then highest:=i;
currentnumber:=currentnumber+1 end;
writeln
B1 B2 B5 B3 B6 B8 B4 B7
分析:我们先不考虑后一条件, 只考虑第一个条件,即把1~8八 个数字放入8个格子中。这是容易 做到的,就是8个数字的全排列, 共有8!=40320种放法。然后对 这8!个可行解用后一个条件加以 检验,输出符合条件的解。对于 后一个条件中“相邻”的判断, 可以建立一个邻接表来解决:
如何优化穷举算法
提高穷举效率的方法:
1、根据问题的实际需要,将反复操 作部分预处理掉; 2、根据问题的实际的条件实施剪枝 处理。
例4、阿姆斯特朗数。 问题描述:编一个程序找出所有的三位数到七位数 中的阿姆斯特朗数。 阿姆斯特朗数也叫水仙花数, 它的定义如下:若一个n位自然数的各位数字的n次 方之和等于它本身,则称这个自然数为阿姆斯特朗数。
for i:=1 to maxlen do digit[i]:=0; digit[3]:=1; highest:=3; currentnumber:=100; total:=0;
while digit[maxlen+1]=0 do
begin sum:=0;
for i:=1 to highest do
例3、除法运算(NOIP1995初中组复赛第一题) 设有下列的和除数。
分析:设除数为x,被除数为y,由算式信息可知: 10<=x<=99,1000<=y<=9999,且8*x<=99, 9*x>=100。因此,我们可选择枚举除数,而被除数 则可按公式y=809*x+1计算得出。
例2、选数:已知n(1<=n<=20)个整数x1,x2,…,xn (1<=xi<=5000000),以及一个整数k(k<n)。从n 个整数中任选k个整数相加,可分别得到一系列的和。 例如当n=4,k=3,4个整数分别为3,7,12,19时, 可得到的全部组合及它们的和为 3+7+12=22,3+7+19=29,7+12+19=38,3+12+19=34。 现在,要求你计算出和为素数的组合共有多少种。 如上例中,只有一种组合的和为素数:3+7+19=29。 输入: 样例 n , k 输入: x1,x2,…,xn 43 输出: 一个整数(满足条件的组合个数) 3 7 12 19 输出: 1
如何来优化算法呢?
如果注意到b3和b6两个格子,与它们“相邻”的格子 有6个,也就是说,放入这两个格子中的数,必须和6个 数不连续,仅可以和一个数是连续的,这样的数只有2个, 即1和8。这样,b1,b3,b6,b8;4个格子中数的放 法仅有两种可能:2、8、1、7和7、1、8、2。而b2、 b4、b5、b7四个格子中的数仅需在3、4、5、6四个 数中选择。经过上述优化,可行解仅有:2×4!=48个, 大大减少了计算量。并且检验是否符合要求, 也只需检查(b1,b2), B1 (b1,b4),(b2,b5), B2 B3 B4 (b4,b7),(b5,b8), B5 B6 B7 (b7,b8)这6对数之差就可以了。