算法实例—枚举
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本算法
1.解析算法 2.枚举算法 3.排序 4.查找
2.枚举算法
c 枚举算法:一一列举问题所有可能的解,并在逐 一列举的过程中,检验每个可能解是否是问题的 真正解。 【例5】.求1-1000中,能被3整除的数。 【例6】.找出1-1000中所有能被7和11整除的数。 【例7】.涂抹单据。5位数的编号缺连续二位。 【例8】.判断一个正整数是否质数。 【例9】.输出1000以内的素数。 【例10】.找水仙花数。 【例11】.鸡兔同笼问题。 【例12】.百鸡百钱问题。
F
i=n
T
输出“否” Leabharlann 出“是”结束【例9】.输出1000以内的素数。
c
开始
i=2
i<n
F
T
F n mod i=0 T
n=1
n<=1000 F
T
i=i+1
i=n+1
F
i=n
T
输出“否” 输出“是”
n=n+1 结束
【例9】.输出1000以内的素数。
c
开始
i=2
i<n
F
T
F n mod i=0 T
n=1
n mod 57=0 or n mod 67=0
i=i+1
如何统计这样的数的个数?
结束
开始
i=0 j=0
F
i<100
T
N=10047+i*100
n mod 57=0 or F n mod 67=0
T
输出 n
j=j+1
i=i+1
输出 个数 j 结束
【例7-1】.某单据1x4x7,缺千位数和十位数,但知道这
a=a+1
结束
【例12】.百鸡百钱问题。
c 鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱
一,百钱买百鸡,问翁、母、雏各几何?
鸡翁
一一列举: a 初值: 0 终值: 20
递增值: 1
检验:
鸡母
b 0 33 1
鸡雏
c 0 100 3
a*5+b*3+c/3=100
开始
a=0
a<=20
F
T b=0
b<=33
i mod 77=0
i=i+1
结束
【例7】.某单据1xx47,缺千位数和百位数,但知道这个
5位数是57或67的倍数,请设计一个算法,输出所有满足
条件的5位数,并统计这样的数的个数。
开始
c
i=1
F
i<=1000
T
i mod 3=0 F
T
输出 i
一一列举: i 初值: 0 终值: 99
递增值: 1
检验: n=10047+i*100
i=i+1
如何统计这样的数的个数?
【例7-1】.某单据1x4x7,缺千位数和十位数,但知道这
个5位数是57或67的倍数,请设计一个算法,输出所有满
足条件的5位数,并统计这样的数的个数。
开始
c
i=0 j=0
n=10407+i*1000+k*10
F
i<10
T
K=0
k<10
F
T
检验
n mod 57=0 or
F
n mod 67=0
T
输出 n
j=j+1
k=k+1
i=i+1
输出 个数 j 结束
【例8】.判断一个正整数是否质数。
开始
c 输入正整数 n
输入 n
一一列举: i 初值: 2
i=2
终值: n-1
i<n
F
T
递增值: 1 检验: n mod i< >0
F n mod i=0 T
i=i+1
i=n+1
F
i=n
n<=1000 F
T
i=i+1
i=n+1
i=n F
T
输出 n
n=n+1 结束
【例10】.找水仙花数。(一个3位数,其各位数字立方和等于该数)
开始
c 一一列举: i
初值: 100
i=100
终值: 999
递增值: 1
F
i<1000
检验:
T
a=int(i/100)
b=int(i/10) mod 10
c=i mod 10
i=i+1 结束
a^3+b^3+c^3=i
F
T
输出 i
【例11】.鸡兔同笼问题 c
今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何?
开始
鸡兔
a=0
a<=35
T
一一列举: a 35-a
初值: 0
F
终值: 35
递增值: 1
a*2+(35-a)*4=94
T
输出 a、35-a
F 检验:
a*2+(35-a)*4=94
F
T c=0
c<=100
F
T
a*5+b*3+c/3=100 F
T 输出 a、b、c
c=c+3
b=b+1
a=a+1
结束
【例5】.求1-1000中,能被3整除的数。
c 开始
枚举时注意:
i=1
不遗漏,不重复,
F
i<=1000
T
i mod 3=0 F
且可能的解有限。 检验:
输检出验Ti
i mod 3=0 F
T
输出 i
i=i+1
结束
【例5】.求1-1000中,能被3整除的数。 c
在枚举算法中往往把问题分解成二部分: 1)一一列举: 这是一个循环结构。要考虑的问题是如何设置循环变 量、初值、终值和递增值。循环变量是否参与检验。 2)检验: 一般是一个分支结构。要考虑的问题是检验的对象是 谁?逻辑判断后的二个结果该如何处理?
分析出以上二个核心问题后,再合成:要注意循 环变量与判断对象是否是同一个变量。
该算法的输入和输出处理:大部分情况下是利用 循环变量来代替。判断的一个分支中实现的。
【例6】.找出1-1000中所有能被7和11整除的数。
c 开始
i=1
F
i<=1000
T
i mod 3=0 F
T
输出 i
i mod 7=0 and i mod 11=0
T
输出“否” 输出“是”
结束
【例9】.输出1000以内的素数。
开始
c 输入正整数 n
输入 n
一一列举: n i i i 初值: 1 2 2 n-1
i=2
终值: 10n0-01 n-12
i<n
F
T
递增值: 1 1 1 -1 检验: n mod i< >0
F n mod i=0 T
i=i+1
i=n+1
个5位数是57或67的倍数,请设计一个算法,输出所有满
足条件的5位数,并统计这样的数的个数。
开始
c 千位 十位
i=0
F
i<10
T
K=0
一一列举: i
k
初值: 0
0
终值: 9
9
递增值: 1
1
k<10
F
检验:n=10407+i*1000+k*10
T
检验
k=k+1
n mod 57=0 or n mod 67=0
1.解析算法 2.枚举算法 3.排序 4.查找
2.枚举算法
c 枚举算法:一一列举问题所有可能的解,并在逐 一列举的过程中,检验每个可能解是否是问题的 真正解。 【例5】.求1-1000中,能被3整除的数。 【例6】.找出1-1000中所有能被7和11整除的数。 【例7】.涂抹单据。5位数的编号缺连续二位。 【例8】.判断一个正整数是否质数。 【例9】.输出1000以内的素数。 【例10】.找水仙花数。 【例11】.鸡兔同笼问题。 【例12】.百鸡百钱问题。
F
i=n
T
输出“否” Leabharlann 出“是”结束【例9】.输出1000以内的素数。
c
开始
i=2
i<n
F
T
F n mod i=0 T
n=1
n<=1000 F
T
i=i+1
i=n+1
F
i=n
T
输出“否” 输出“是”
n=n+1 结束
【例9】.输出1000以内的素数。
c
开始
i=2
i<n
F
T
F n mod i=0 T
n=1
n mod 57=0 or n mod 67=0
i=i+1
如何统计这样的数的个数?
结束
开始
i=0 j=0
F
i<100
T
N=10047+i*100
n mod 57=0 or F n mod 67=0
T
输出 n
j=j+1
i=i+1
输出 个数 j 结束
【例7-1】.某单据1x4x7,缺千位数和十位数,但知道这
a=a+1
结束
【例12】.百鸡百钱问题。
c 鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱
一,百钱买百鸡,问翁、母、雏各几何?
鸡翁
一一列举: a 初值: 0 终值: 20
递增值: 1
检验:
鸡母
b 0 33 1
鸡雏
c 0 100 3
a*5+b*3+c/3=100
开始
a=0
a<=20
F
T b=0
b<=33
i mod 77=0
i=i+1
结束
【例7】.某单据1xx47,缺千位数和百位数,但知道这个
5位数是57或67的倍数,请设计一个算法,输出所有满足
条件的5位数,并统计这样的数的个数。
开始
c
i=1
F
i<=1000
T
i mod 3=0 F
T
输出 i
一一列举: i 初值: 0 终值: 99
递增值: 1
检验: n=10047+i*100
i=i+1
如何统计这样的数的个数?
【例7-1】.某单据1x4x7,缺千位数和十位数,但知道这
个5位数是57或67的倍数,请设计一个算法,输出所有满
足条件的5位数,并统计这样的数的个数。
开始
c
i=0 j=0
n=10407+i*1000+k*10
F
i<10
T
K=0
k<10
F
T
检验
n mod 57=0 or
F
n mod 67=0
T
输出 n
j=j+1
k=k+1
i=i+1
输出 个数 j 结束
【例8】.判断一个正整数是否质数。
开始
c 输入正整数 n
输入 n
一一列举: i 初值: 2
i=2
终值: n-1
i<n
F
T
递增值: 1 检验: n mod i< >0
F n mod i=0 T
i=i+1
i=n+1
F
i=n
n<=1000 F
T
i=i+1
i=n+1
i=n F
T
输出 n
n=n+1 结束
【例10】.找水仙花数。(一个3位数,其各位数字立方和等于该数)
开始
c 一一列举: i
初值: 100
i=100
终值: 999
递增值: 1
F
i<1000
检验:
T
a=int(i/100)
b=int(i/10) mod 10
c=i mod 10
i=i+1 结束
a^3+b^3+c^3=i
F
T
输出 i
【例11】.鸡兔同笼问题 c
今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何?
开始
鸡兔
a=0
a<=35
T
一一列举: a 35-a
初值: 0
F
终值: 35
递增值: 1
a*2+(35-a)*4=94
T
输出 a、35-a
F 检验:
a*2+(35-a)*4=94
F
T c=0
c<=100
F
T
a*5+b*3+c/3=100 F
T 输出 a、b、c
c=c+3
b=b+1
a=a+1
结束
【例5】.求1-1000中,能被3整除的数。
c 开始
枚举时注意:
i=1
不遗漏,不重复,
F
i<=1000
T
i mod 3=0 F
且可能的解有限。 检验:
输检出验Ti
i mod 3=0 F
T
输出 i
i=i+1
结束
【例5】.求1-1000中,能被3整除的数。 c
在枚举算法中往往把问题分解成二部分: 1)一一列举: 这是一个循环结构。要考虑的问题是如何设置循环变 量、初值、终值和递增值。循环变量是否参与检验。 2)检验: 一般是一个分支结构。要考虑的问题是检验的对象是 谁?逻辑判断后的二个结果该如何处理?
分析出以上二个核心问题后,再合成:要注意循 环变量与判断对象是否是同一个变量。
该算法的输入和输出处理:大部分情况下是利用 循环变量来代替。判断的一个分支中实现的。
【例6】.找出1-1000中所有能被7和11整除的数。
c 开始
i=1
F
i<=1000
T
i mod 3=0 F
T
输出 i
i mod 7=0 and i mod 11=0
T
输出“否” 输出“是”
结束
【例9】.输出1000以内的素数。
开始
c 输入正整数 n
输入 n
一一列举: n i i i 初值: 1 2 2 n-1
i=2
终值: 10n0-01 n-12
i<n
F
T
递增值: 1 1 1 -1 检验: n mod i< >0
F n mod i=0 T
i=i+1
i=n+1
个5位数是57或67的倍数,请设计一个算法,输出所有满
足条件的5位数,并统计这样的数的个数。
开始
c 千位 十位
i=0
F
i<10
T
K=0
一一列举: i
k
初值: 0
0
终值: 9
9
递增值: 1
1
k<10
F
检验:n=10407+i*1000+k*10
T
检验
k=k+1
n mod 57=0 or n mod 67=0