一、枚举法的本质
枚举法本质就是搜索算法,通过一一列通过暴力方式找出每一个符合情况的元素;枚举也称作 穷举,指的是从问题所有可能的解的集合中一一枚举各元素。
二、基本思想:
用题目中给定的检验条件判定哪些是无用的,哪些是有用的。能使命题成立。即为其解。
三、优缺点:
优点:算法简单,操作性强,在局部地方使用枚举法,效果会十分不错。
缺点:运算量过大,当问题的规模变大的时候,循环的阶数越大,执行速度越慢(时间复杂度会升高)。
四、枚举框架
n=0;for(k=<区间下限>;k<=<区间上限>;k++)// 控制枚举范围if(<约束条件>) // 根据约束条件实施筛选{ printf(<满足要求的解>); // 输出解n++; // 统计解的个数}
五、应用例题
1.枚举法计算最大公约数(通过对两个数中较小的数进行递归,逐一尝试求出符合条件的值)
int main()
{ long m,n,c;
printf("请输入正整数m,n: ");
scanf("%ld,%ld",&m,&n); // 输入正整数m,n
if(mn
for(c=n;c>=1;c--) // c枚举循环
if(m%c==0 && n%c==0) break; // 按定义判定
printf("(%ld,%ld)=%ld\n",m,n,c); // 输出结果
}
2.统计与求和,要求计算并输出代数和四舍五入精确到小数点后第6位
例如对此公式的求和:
问题思路:我们能够发现分母能够被三整除的分式前为负号,不然则为正好
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); //输出结果
}
3.整数搜索佩尔方
例:搜索合数世纪
#include
#include
void main()
{long a,n,k; int b,m,s,x;
printf(" 请确定m: "); scanf("%d",&m); //探索前m个合数世纪
a=1;b=0;
while (b
需要解释的是:
(3)变量k的增量是 k+=2,表示每次将变量k的值加2,相当于 k=k+2。这样做的目的是只考虑奇数因子,因为偶数因子一定能被2整除。
通过以上三个简单的例子我相信这个简单的算法就轻松拿捏了~
解佩尔