上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.1 蛮力法
2.1.1 蛮力法的设计思想
蛮力法(bruteforcemethod,也称穷举法)通常采用一定的策略依次处理待求解问题的所有数据,从而找出问题的解,是一种简单直接地解决问题的方法。例如,对于给定的整数a和非负整数n,计算an的值,最直接的想法就是把1和a相乘n次。
蛮力法常常直接基于问题的描述,所以是最容易应用的方法。但是,用蛮力法设计的算法其时间性能往往也是最低的。因此,蛮力法通常用来解决非常基本的问题。在本书中,有关线性表的基本操作、顺序查找算法、模式匹配BF算法、起泡排序、简单选择排序等算法都是蛮力法的应用实例。
2.1.2 算法设计实例——数字谜
【问题】 求解如图2-1所示数字谜。
图2-1 数字谜
【想法】 将A、B、C依次试探每一个可能解,约束条件是满足等式关系(ABB)×B=ACBC。
【算法】 注意到,A的穷举范围是1~9,B的穷举范围是2~9(因为乘法结果有进位,则B至少是2),C的穷举范围是0~9,算法用伪代码描述如下:
算法:数字谜
输入:无
输出:三个整数A、B和C
1.初始化结果标志flag=0;
2.将A从1到9依次试探
2.1 将B从2到9依次试探
2.1.1 将C从0到9依次试探
2.1.1.1 temp1←计算ABB的值;
2.1.1.2 temp2←计算ACBC的值;
2.1.1.3 如果temp1*B等于temp2,则输出A、B和C的值;结果标志flag=1;
3.如果结果标志flag等于0,则输出“无解”;
【程序】 可以在主函数中直接实现数字谜算法,程序如下:
#include<stdio.h> //使用库函数printf intmain() { intA,B,C,temp1,temp2,flag=0; for(A=1;A<=9;A++) //将A从1到9依次试探
for(B=2;B<=9;B++) //将B从2到9依次试探 for(C=0;C<=9;C++) //将C从0到9依次试探 { temp1=A*100+B*10+B; //计算ABB的值 temp2=A*1000+C*100+B*10+C; //计算ACBC的值 if(temp1*B==temp2) //如果ABB*B等于ACBC { printf("A=%d,B=%d,C=%d\n",A,B,C); //输出结果 printf("%d×%d=%d\n",temp1,B,temp2); flag=1; } //结束if语句 } //结束内层for循环 if(flag==0)printf("无解\n"); //穷举过程中没有满足约束条件的解 return0; //将0返回操作系统,表明程序正常结束 }