计算机常用算法与程序设计第2章 枚举

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.4 解不等式
2.4.2
分数不等式
案例提出:
1. 枚举设计要点 设和变量为s,递增变量为i,两者赋初值为0。 在s<=m1的条件循环中,根据递增变量i对s累 加求和,直至出现s>m1退出循环,赋值c=i,所得 c为n解区间的下限。 继续在s<=m2的条件循环中,根据递增变量i对 s累加求和,直至出现s>m2退出循环,通过赋值 d=i-1,所得d为n解区间的上限。注意,解的上限 是d=i-1,而不是i。 然后打印输出不等式的解区间[c,d]。

2. 枚举设计描述
y=1; while(y<=10000000)
{
}
y++; // 设置y从1开始递增1枚举 a=n*y*y; x=floor(sqrt(a+1)); if(x*x==a+1) // 检测是否满足方程 { printf(" x=%.0f, y=%.0f\n",x,y); break; }
第2章 枚 举
教学要求

了解枚举算法的概念与枚举设计要领

应用枚举求解统计求和与求最值等基本案例
本章重点


对某些枚举算法进行改进与优化
掌握枚举算法时间复杂度分析
2.1 枚举概述

1. 枚举的概念
(1) 枚举法(Enumerate)也称为列举法、穷举法, 是蛮力策略的体现,又称为蛮力法。 (2) 枚举是一种简单而直接地解决问题的方法,其 基本思想是逐一列举问题所涉及的所有情形 。
2. 枚举设计描述
while (b<m)




}
{ a++;s=0; // 检验a世纪 for(n=a*100-99;n<=a*100-1;n+=2) // 穷举a世纪奇数年号n { x=0; for(k=3;k<=sqrt(n);k+=2) if(n%k==0) {x=1;break;} if(x==0)break s=s+x; // 年号n为合数时,x=1,s增1 } if(s==50) // s=50,即50个奇数均为合数 { b++; printf(" 第%d个合数世纪为:%ld 世纪,",b,a); printf("年号%ld至%ld全为合数。\n",a*100-99,a*100); }
Fra Baidu bibliotek 2.4 解方程
2.4.1
解佩尔方程
案例提出: 佩尔(Pell)方程是关于x,y的二次不定方程
(其中n为非平方正整数) 当x=1或x=-1,y=0时,显然满足方程。常把x,y 中有一个为零的解称为平凡解。•我们要求佩尔方 程的非平凡解。
1. 枚举设计要点
设置y从1开始递增1取值,对于每一个y值,计算 a=n*y*y后判别: 若a+1为某一整数x的平方,则(x,y)即为所求佩尔方程 的基本解。 若a+1不是平方数,则y增1后再试,直到找到解为止。 应用以上枚举探求,如果解的位数不太大,总可以求出 相应的基本解。 如果基本解太大,应用枚举无法找到基本解,可约定一 个枚举上限,例如10000000。可把y<=10000000作为循环条 件,当y>10000000时结束循环,输出“未求出该方程的基本 解!”而结束。
(3) 应用枚举时应注意对问题所涉及的有限种情形 进行一一列举,既不能重复,又不能遗漏。
2. 枚举的框架描述
n=0; for(k=<区间下限>;k<=<区间上限>;k++)


// 控制枚举范围 if(<约束条件>) // 根据约束条件实施筛选 { printf(<满足要求的解>); // 输出解 n++; // 统计解的个数 }
设n为正整数,求代数和
1 1 1 1 1 1 s(n) 1 2 3 4 5 6 n
和式中各项的符号为二个“+”号后一个“-”号,即分 母能被3整除的项为“-”,其余项为“+”。 输入n,要求计算并输出代数和四舍五入精确到小数点后 第6位。

1. 枚举设计要点
2.3 整数搜索
2.3.2
搜索合数世纪
一个世纪的一百个年号中常存在有素数。例如,现在所处
的21世纪的100个年号中存在2003,2011等14个素数。那么, 是否存在一百个年号中没有素数的世纪?
定义:若一个世纪的100个年号中不存在素数,即100个年
号全为合数的世纪称为合数世纪。
输入正整数m(约定m≤100),试探索前m个合数世纪。
3. 枚举的实施步骤
(1)根据问题的具体情况确定枚举量(简单变量
或数组); (2)根据问题的具体实际确定枚举范围,设置枚 举循环; (3)根据问题的具体要求确定筛选(约束)条件; (4)设计枚举程序并运行、调试,对运行结果进 行分析与讨论。
2.2 统计与求和
2.2.1

求代数和
案例提出:
1. 枚举设计要点
设变量b统计合数世纪个数,设置条件循环,条件即为b<m; 探索a世纪,从a=1开始递增1取值。设第a世纪的50个奇数年号(偶数
年号无疑均为合数)为n,显然有: a*100-99≤n≤a*100-1 设置n(a*100-99~a*100-1)循环,n步长为2,枚举a世纪奇数年号 n; 设置k(3~)试商循环,k步长为2,应用试商判别年号n是否为素 数: 若n为素数,退出试探下一个世纪; 若n为合数,并用变量s统计这50个n年号中的合数的个数。 对于a世纪,若s=50,即50个奇数都为合数,找到a世纪为合数世纪, 用b++统计合数世纪的个数, 并打印输出第b个合数世纪为a 世纪,同 时输出其年号范围。
设置k(1~n)循环实施枚举,k代表每一项的分母。
根据参数k的取值选取求和操作: 若k不能被3
整除,s=s+1.0/k; 否则 若k能被3 整除,s=s-1.0/k; 循环结束,输出代数和s。
2. 枚举设计描述
//
求代数和s=1+1/2-1/3+1/4+1/5-1/6+...+-1/n #include <stdio.h> void main() { long n,k; double s=0; printf(" 请输入正整数n: "); scanf("%ld",&n); for(k=1;k<=n;k++) { if(k%3>0) s=s+1.0/k; // 按k取值求代数和 else s=s-1.0/k; } printf(“ s(%ld)=%.6f \n”,n,s); //输出结果 }
相关文档
最新文档