超难奥数题之数论专题:穷举用技巧

合集下载

穷举法详细

穷举法详细

第三讲穷举法一、穷举法的基本概念穷举方法是基于计算机特点而进行解题的思维方法。

一般是在一时找不出解决问题的更好途径(即从数学上找不到求解的公式或规则)时,可以根据问题中的的部分条件(约束条件)将所有可能解的情况列举出来,然后通过一一验证是否符合整个问题的求解要求,而得到问题的解。

这样解决问题的方法我们称之为穷举算法。

穷举算法特点是算法简单,但运行时所花费的时间量大。

有些问题所列举出来的情况数目会大得惊人,就是用高速的电子计算机运行,其等待运行结果的时间也将使人无法忍受。

因此,我们在用穷举方法解决问题时,应尽可能将明显的不符合条件的情况排除在外,以尽快取得问题的解。

二、穷举算法模式穷举算法模式:(1)问题解的可能搜索的范围:用循环或循环嵌套结构实现(2)写出符合问题解的条件。

(3)能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。

三、使用穷举法设计算法穷举法应用很多,比如一些密码破译软件通常就是用的穷举算法。

如在QQ上,OicqPassOver这个工具穷举你的口令,它根据机器性能最高可以每秒测试20000个口令,如果口令简单,一分钟内,密码就会遭到破译。

下面我们来以三个例子说明穷举法的具体应用。

实例一:古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2~1000内的所有完全数。

分析:(1)本题是一个搜索问题,搜索范围 2~1000,找出该范围内的完全数;(2)完全数必须满足的条件:因子的和等于该数据的本身。

(3)问题关键在于将该数的因子一一寻找出来,并求出因子的和。

程序如下:Program p3_1 ;Var a , b,s :integer ;BeginFor a:=2 to 1000 doBeginS:=0 ;For b:=1 to a -1 doIf a mod b =0 then s:=s+b ; { 分解因子并求和 }If a=s then beginWrite( a, ‘=’ ,1, );For b:=2 to a -1 doIf a mod b=0 then write( ’+’, b );Writeln ;End;End;End.当程序运行后,输出结果:6 = 1 + 2 + 328 = 1 + 2 + 4 + 7 + 14496 =1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248实例二:(第七届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题)在A,B两个城市之间设有N个路站(如下图中的S1,且N<100),城市与路站之间、路站和路站之间各有若干条路段(各路段数≤20,且每条路段上的距离均为一个整数)。

穷举法

穷举法
Βιβλιοθήκη 穷举法一、引 入穷举法
实例一:输入绳子的长度n,将该绳子分成三段, 每段的长度为正整数,输出由该三段绳子组成的 三角形个数。
算法分析:没有公式直接求出三角形的个数,所以程 序只能采用穷举法,一一验证范围内的数是否能构成 三角形,若是则累计。
一、引 入
穷举法
s:=0; for a:=1 to n-2 do for b:=a to n-2 do for c:=b to n-2 do if (a+b>c) and (b+c>a) and (c+a>b) and (a+b+c=n) then s:=s+1;
四、穷举法 应用 实例二:有形如:ax +bx +cx+d=0 这样的
3 2
一个一元三次方程。给出该方程中各项的系数 (a,b,c,d 均为实数),并约定该方程存在 三个不同实根(根的范围在-100至100之间), 且根与根之差的绝对值>=1。要求由小到大依 次在同一行输出这三个实根(根与根之间留有 空格),并精确到小数点后2位。 提示:记方程f(x)=0,若存在2个数x1和x2, 且x1<x2,f(x1)*(x2)<0,则在(x1,x2) 之间一定有一个 根。 样例 输入:1 -5 -4 20 输出:-2.00 2.00 5.00
穷举法
五、穷举算法 的深入应用 算法分析:
为了使得程序尽快运行出正确结果,程序中使用 了一个数组power存放所有数字的各次幂之值, power[i,j]等于i的j次方。变量currentnumber 存放当前要被验证的数,数组digit存放当前数的 各位数字,开始时digit[3]=1,其它元素均为0,此 时表示当前数为100。 highest为当前数的位数。

穷举法

穷举法
算法--穷举法
MR.CHEW 2018.11.22
导入
• 某个暑假你携带密码行李箱外出旅游,旅行中发现自己 忘记了开锁的密码,怎么办?
用穷举法设计程序
• 一、穷举法的基本思想
• 二、穷举法的程序实践
• 三、穷举算法总结
穷举法的基本含义
• 穷举法也称为“枚举法”或“列举法”。 • 穷举法,指在一个有穷的可能的解的集合中,一一列举 出集合中的每一个元素。用题目给定的检验条件来判断 该元素是否符合条件,若满足条件,则该元素为本问题 的一个解;否则,该元素就不是本问题的解。 • 穷举法在具体的程序实现过程中,可以通过循环和条件 判断语句来完成。 • 穷举法常用于解决“是否存在”或“有多少种可能”等类型的 问题
穷举法的应用举例
• 4.水仙花数问题
• 水仙花数是指一个三位数,它的各位数的立方和正好是 等于该数本身。例如153=1^3+5^3+3^3。请设计算法求 解该问题。
1.思路:三位数范围100--999 2.约束条件:该三位数的各位数的立方和正好是 等于该数本身 3.程序结构选择:1重循环
谢谢!
2.程序结构选择:2重循环
百钱百鸡
• 3.我国古代数学家张丘建在《算经》一书中提出的数学 问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。 百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
1.思路:确定公鸡的范围,母鸡的范围,小鸡的 范围 2.约束条件:总共100元钱,100只鸡 3.程序结构选择:3重循环
1.思路:枚举所有情况1000--1999 2.约束条件:5人一组剩余1人,7个人一组还剩 两个人,8个人一组还剩3个人 3.程序结构选择:1重循环
穷举法的应用举例
• 2.鸡兔同笼

穷举

穷举
1,2 , 3,4 , 5
最优解Biblioteka 11, 3, 4 2,5 ,
5 4
3 2
4
三、回溯法:八皇后问题
要求在8×8格的国际象棋棋盘上摆放 要求在 × 格的国际象棋棋盘上摆放 8个皇后,使其不能互相攻击。由于 个皇后,使其不能互相攻击。由于 皇后的走棋法是可以横走、直走、走 斜线,每次走任意格数,所以要求这 八个皇后中的任意两个都不处于同一 行、同一列或同一斜线上。问有多少 种摆法? 分析: 穷举法 穷举法”, 个皇后各占一行, 分析:“穷举法 ,8个皇后各占一行, 穷举每一行上可能占有的列,再排除 不合条件的情况,只输出合理的解。
表示一个皇后的控制范围(续)
同理,从左下角到右上角的主对角线及平 行线(即斜率为 的各斜线)上, (行号 - 列 行线 即斜率为-1的各斜线 上, 行号 即斜率为 的各斜线 相等,从左到右的15条直线这种差值 号)相等,从左到右的 条直线这种差值 相等,从左到右的 分别为7, 分别为 6, 5, …,0, -1, -2,…,-7。 , , , 。 用以下的变量来表示当摆设第i个皇后时, 用以下的变量来表示当摆设第 个皇后时, 前面几个皇后在各列、各± 前面几个皇后在各列、各± 对角线上的占 用情况 bool A[n]; // 第j行皇后 行皇后 bool B[2*n-1]; // 斜率为 的对角线 斜率为+1的对角线 bool C[2*n-1]; // 斜率为-1, C[i-j+7] 斜率为 ,
• 从人工模拟的角度可直接从第 个回溯 从人工模拟的角度可直接从第6个回溯 • 从算法的角度是继续试探第7个 从算法的角度是继续试探第 个
4
试探安排八个皇后(续2)
在回溯的过程中,应该抹掉前面试探 留下的标记,即恢复A[j]、B[i+j]、 留下的标记,即恢复 、 、 C[i-j+7]为未被占用状态,这样才能 为未被占用状态,这样才能 正确地开展下一步的试探。 不管是找到了解还是没有找到解都必 须抹掉以前的标记,并回溯。 这种回溯过程将逐步返回,使得各行 的皇后都能试探到各种可能的摆法

穷举算法及解题

穷举算法及解题

穷举算法及解题穷举算法及解题例12-1 古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2~1000内的所有完全数。

问题分析(1)本题是一个搜索问题,搜索范围2~1000,找出该范围内的完全数;(2)完全数必须满足的条件:因子的和等于该数的本身;(3)问题关键在于将该数的因子一一寻找出来,并求出因子的和:分解因子的方法比较简单,采用循环完成分解因子和求因子的和。

程序如下:program p12_1;var a,b,s:integer;beginfor a:=2 to 1000 dobegins:=0;for b:=1 to a-1 doif a mod b =0 then s:=s+b;if a=s then beginwrite(a,&#39;=&#39;,1,);for b:=2 to a-1 doif a mod b=0 then write(&#39;+&#39;,b);writeln;end;end;end.当程序运行后,输出结果:6=1+2+328=1+2+4+7+14496=1+2+4+8+16+31+62+124+248例12-3邮局发行一套票面有四种不同值的邮票,如果每封信所帖邮票张数不超过三枚,存在整数r,使得用不超过三枚的邮票,可以贴出连续的整数1、2、3、……、r来,找出这四种面值数,使得r值最大。

问题分析:本题则是知道每封信邮票数的范围(&lt;=3),邮票有四种类型,编程找出能使面值最大邮票。

其算法是:(1) 面值不同的四种邮票,每封信所贴邮票不超过3张;(2) 用这四种邮票贴出连续的整数,并且使r值最大;(3) 用穷举法,找出所有符合条件的解;(4) 本题用集合的方法统计邮票的面值,提高判重的速度。

设四种邮票的面值分别为:a,b,c,d,根据题意设:a&lt;b&lt;c&lt;d,因此a=1,用循环语句完成搜索。

穷举法——精选推荐

穷举法——精选推荐

第16章 穷举算法与实验穷举方法是基于计算机特点而进行解题的思维方法。

一般是在一时找不出解决问题的更好途径(即从数学上找不到求解的公式或规则)时,可以根据问题中的的部分条件(约束条件)将所有可能解的情况列举出来,然后通过一一验证是否符合整个问题的求解要求,而得到问题的解。

这样解决问题的方法我们称之为穷举算法。

穷举算法特点是算法简单,但运行时所花费的时间量大。

因此,我们在用穷举方法解决问题时,应尽可能将明显的不符合条件的情况排除在外,以尽快取得问题的解。

虽然穷举法效率并不高,但是适应一些没有明显规律可循的问题的解决。

因为穷举算法就是从所有可能的情况中搜索正确的答案,所以一般可按如下步骤: 第1步: 对于一种可能的情况,列举出来并计算其结果;第2步:判断结果是否满足要求,如果不满足则执行第1步来搜索下一个可能的情况,如果满足要求,则表示寻找到一个正确的答案,执行下一步操作,如寻找其他正确(合适)的答案或者中断循环。

16.1三角形数问题16.1.1 问题描述将 ,F ,E ,D ,C ,B ,A 这六个变量排成如图所示的三角形,这六个变量分别取[1,6]上的整数,且均不相同。

求使三角形三条边上的变量之和相等的全部解。

如图就是一个解。

A 6B C 3 1D F 2 4E 516.1.2 问题分析程序引入变量123456,,,,,i i i i i i ,代表,F ,E ,D ,C ,B ,A 并让它们分别顺序取1至6的正整数,在它们互不相同的前提条件下,测试由它们排成的如图所示的三角形三条边上的变量之和是否相等,如相等即为一种满足要求的排列,把它们输出。

当这些变量取尽所有的组合后,程序就可得到全部可能的解。

细节见下面的程序。

【程序1】%穷举法解三角形数 for i1=1:6 for i2=1:6 if i1==i2 continue;endfor i3=1:6if i1==i3 || i2==i3continue;endfor i4=1:6if i1==i4 || i2==i4 || i3==i4continue;endfor i5=1:6if i1==i5 || i2==i5 || i3==i5 || i4==i5continue;endfor i6=1:6if i1==i6 || i2==i6 || i3==i6 || i4==i6 || i5==i6continue;endif i1+i2+i4==i1+i3+i6 && i1+i2+i4==i4+i5+i6fprintf ('%6d\n',i1) ;fprintf ('%4d%4d\n',i2,i3) ;fprintf ('%2d%4d%4d\n\n',i4,i5,i6) ;endendendendendendEnd16.1.3 问题讨论按穷举法编写的程序通常不能适应变化的情况。

用穷举法解决问题

用穷举法解决问题

任务二:编写求三位水仙花数程序
a=x\100 b=(x-a*100)\10 c=x-a*100-b*10
水仙花代码:
Dim x, a,b, c, i As Integer For x = 100 To 999 Step 1 a = i \ 100 b = (i - a * 100) \ 10 c= i - a * 100 - b * 10 If a^3 + b^3 + c^3 = x Then Print x End If Next x
穷举法的适用条件:
①求解对象应该是有限的; ②有穷举规则 ③一时找不出解决问题的更好途径时;
穷举法解决问题步骤:
通常可以从两个方面进行分析: ⑴确定范围:问题所涉及的情况有哪些,情况 的种数可不可以确定。 ⑵验证条件:分析出来的这些情

任务三:百钱买百鸡”


相传我国南北朝时,京城有个卖鸡的张姓老汉,他有一 个儿子非常聪明,尤其擅长算术,到十二三岁时已是远近闻 名的“小神童”了。当朝宰相听说后想试探个究竟,于是派 仆人到张老汉的店里打听鸡的价钱,张老汉告知“公鸡五文 钱一只,母鸡三文一只,小鸡一文三只”。于是,仆人给他 一百文钱,要求公鸡、母鸡、小鸡都要,数量不多不少正好 一百只,命他次日送到府上。这可难为了张老汉,他怎么凑 也凑不够这个数,只好问儿子。“小神童”不慌不忙,掐指 一算就给出了答案,第二天照数送到宰相府。宰相见难不倒 “小神童”,又让仆人给张老汉一百文钱,要求再买一百只 鸡,搭配方法不能和上次一样。结果“小神童”又很快给出 了答案,宰相暗暗称奇,想最后再试一次,谁知还是没有难 倒“小神童”。 这个故事就是我国古代数学名著《张邱建算经》里的百 鸡百钱问题。请用穷举法求解所有的组合方法。

穷举法

穷举法

【实例1-4】完美运算式

把数字1、2、…、9这9个数字填入以下含 加减乘除与乘方的综合运算式中的9个□中, 使得该式成立 □^□+□□÷□□-□□×□=0 要求数字1,2,…、9这9个数字在式中都 出现一次且只出现一次。
编程思路1


设式右的6个整数从左至右分别为 a、b、x、y、z、c, 其中x、y、z为2位整数,范围为12~98;a、b、c为一 位整数,范围为1~9。 设臵a、b、c、x、y、z循环,对穷举的每一组a、b、c、 x、y、z,进行以下检测:


若x不是y的倍数,即 x % y!=0,则返回继续下一次穷举。 若等式不成立,即a^b+x/y-z*c!=0,则返回继续下一次穷举。 式中9个数字是否存在相同数字。将式中6个整数共9个数字 进行分离,分别赋值给数组元素f[1]~f[9]。连同附加的 f[0]=0(为保证9个数字均不为0),共10个数字在二重循环 中逐个比较。
【实例1-2】4位分段和平方数

一个4位自然数分为前后两个2位数,若该 数等于所分两个2位数和的平方,则称为4 位分段和平方数。例如,2025=(20+25)2。
编写程序求出所有4位分段和平方数。
编程思路1

对所有的4位整数n进行穷举,n的范围为 1000~9999,共9000个数。对每个数n,分 离出高两位数x(x=n/100)和低两位数y (y=n%100),然后进行判断,若满足 n==(x+y)*(x+y),则n是一个4位分段和平方 数。
编程思路2


按程序1的思路,穷举次数有99次,如果分别设三 个数为x、2x和3x,以x为枚举对象,则x的最小值 为123、最大值为329(因为下一个数 341*3=1023>987),穷举的范围就减少为107。 由于对x进行穷举,因此需要将3个三位数的各个位 上的数字分离出来。这9个数字可以像程序1中一样, 用A~I这9个变量来保存。在程序2中,我们采用另 外一种方法。定义一个一维数组a[9],把组成整数x、 2x、3x的9个数字存放在数组a中。然后用一个二重 循环统计1~9这9个数字是否全在数组中出现。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

穷举用技巧
【例1】
N是一个各位数字互不相等的自然数,它能被它的每个数字整除。

N的最大值是。

【例2】
如果连续N个自然数,每个自然数的数字和都不是11的倍数,则称这连续的N个自然数为一条“龙”,n为这条龙的长度。

比如1,2,3,…,28就是一条龙,它的长度是28。

问:龙的长度最长可以为多少?写出一条最长的龙。

【例3】
黑板上写有1、2、3、……、100这100个自然数,甲、乙二人轮流每次每人划去一个数,直到剩下两个数为止。

如剩下的两数互质则判甲胜,否则判乙胜。

⑴乙先划甲后划,谁有必胜策略?必胜策略是怎样的?
⑵甲先划乙后划,谁有必胜策略?必胜策略是怎样的?
【例4】
如果一个自然数的2004倍恰有2004个约数,这个自然数自己最少有多少个约数?
测试题
【例1】求所有能被30整除,且恰有30个不同约数的自然数。

【例2】在1到100中,恰好有6个约数的数有多少个?
答案:
【例1】【分析】
由于30235=⨯⨯,从质数的观点看整除,如果自然数N 能被30整除,那么自然数N 至少含有三个质因数2,3,5。

设:312235r r r N =⨯⨯⨯。

自然数N 恰有30个不同的因数,根据约数的个数公式:12311130235r r r +⨯+⨯+⨯==⨯⨯()()()。

注意
到235⨯⨯是三个约数之积,由此可知自然数N 中质因数的个数恰好有3个。

因此
123111235r r r +⨯+⨯+=⨯⨯()()(),由此可知123r r r (,,)必是
124(, , )的一个排列。

综上所述,所求的自然数有:24235⨯⨯,42235⨯⨯,24235⨯⨯,42235⨯⨯,42235⨯⨯,24235⨯⨯。

【例2】【分析】
6只能表示为()51+或()()1121++,所以恰好有6个约数的数要么能表示成某个质数的5次方,要么表示为某个质数的平方再乘以另一个质数,100以内符合前者的只有32,符合后者的数枚举如下:
222222222222222232527211213217219223
8323537311
45253
2721⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯⨯种种种种 所以符合条件的自然数一共有1842116++++=(种)。

相关文档
最新文档