第四章——蛮力法

蛮力法概述

蛮力法也称穷举法(枚举法)或暴力法,是一种简单的直接解决问题的方法,通常根据问题的描述和所涉及的概念定义,对问题所有可能的状态(结果)一一进行测试,直到找到解或将全部可能的状态都测试一遍为止。

蛮力法的“力”指的是计算机的运算能力,蛮力法是基于计算机运算速度快的特性,减少人的思考而把工作都交给计算机的“懒惰”策略(这里的懒惰指的是人懒,不是算法中的懒惰方法),一般而言是最容易实现的方法。

蛮力法的优点如下:

1.逻辑简单清晰,根据逻辑编写的程序简单清晰。
2.对于一些需要高正确性的重要问题,它产生的算法一般而言是复杂度高但合理的。
3.解决问题的领域广。
4.适用于一些规模较小,时间复杂度要求不高的问题。
5.可以作为其他高校算法的衡量标准,即作为被比较的例子。

主要缺点就是因为缺少人的思考,算法往往设计的简单而缺乏高的效率。

蛮力法依赖的是将每个元素(状态)处理一次的扫描技术,通常在以下几种情况使用蛮力法:

搜索所有的解空间:问题的解存在于规模不大的解空间中。

搜索所有的路径:这类问题中不同的路径对应不同的解。

直接计算:按照基于问题的描述和所涉及的概念定义,直接进行计算。往往是一些简单的题,不需要算法技巧的。

模拟和仿真:按照求解问题的要求直接模拟或仿真问题的过程即可。

作为算法的设计者,不要被这些人为设计的概念框住自己的手脚,通过自己的认识合理的利用资源高效地处理问题才是我们需要做到的。


蛮力法的直接应用

介绍一些直接采用蛮力法解决问题的例子。

直接采用蛮力法的一般格式

在直接采用蛮力法设计算法中,主要是使用循环语句和选择语句:循环语句用于穷举所有可能的情况,而选择语句判定当前的条件是否为所求的解。

模型比较简单就不看了(不要拘泥于模型,去体会思想)。

例题 4.1

编写一个程序,输出2到1000之间的所有完全数。完全数就是指该数的各因子(除该数本身外)之和正好等于该数本身。

直接采用蛮力法的方式就是将2到1000的所有数穷举一遍,对每个可能是完全数的数,求解他们除本身之外的各因子之和与原数进行比较。

for (m=2;m<=1000;m++){
     
	//求出m的所有因子之和s;
  if (m==s) 输出s;
}

求解所有因子的过程依旧是一个穷举的过程,除本身之外的因子大小不会超过本身的一半,穷举1到本身的一半判断能够整除即可,结合起来对应的蛮力法如下:

void main(){
     
	int m,i,s;
	//穷举2-1000的所有整数 
    for (m=2;m<=1000;m++){
   
		s=0;//s为因子的和
		//穷举1到m/2的所有可能为因子的整数 
        for (i=1;i<=m/2;i++) if (m%i==0) s+=i;//i是m的一个因子 
        if (m==s) printf("%d ",m);
	}
}

例 4.2

编写一个程序,求这样的四位数:这个四位数的十位是1,个位是2,这个四位数减去7就能被7整除,减去8就能被8整除,减去9就能被9整除。

设这个数的十进制表示为ab12,则数值n=1000*\a+100*b+12,采用穷举法穷举a和b:

int n,a,b;
//穷举a和b,即穷举最后两位为12的四位数 
for (a=1;a<=9;a++) for (b=0;b<=9;b++){
   
	n=1000*a+100*b+12;
	//判断n是否满足题中的给定条件
	//输出n 
}

减去7被7整除,减去8被8整除,减去9被9整除就是简单的基本运算的组合,完整的蛮力法如下:

int n,a,b;
//穷举a和b,即穷举最后两位为12的四位数 
for (a=1;a<=9;a++) for (b=0;b<=9;b++){
   
	n=1000*a+100*b+12;
	//判断n是否满足题中的给定条件
	if ((n-7)%7==0&&(n-8)%8==0&&(n-9)%9==0) printf("n=%d\n",n);
}

例 4.3

在象棋算式里,不同的棋子代表不同的数,有以下算式,设计一个算法求这些棋子各代表哪些数字。

在这里插入图片描述
直接采用穷举法的思想就是,对于五个棋子的取值分别进行枚举,然后判断对于一套取值是否能在不重复的前提下,满足竖式的要求。

对应的蛮力法如下:

void fun(){
     
	int a,b,c,d,e,m,n,s;
	//分别穷举兵,炮,马,卒,车的各种可能 
    for (a=1;a<=9;a++) for (b=0;b<=9;b++) for (c=0;c<=9;c++) for (d=0;d<=9;d++) for (e=0;e<=9;e++)
        //避免取值的重复 
		if (a==b||a==c||a==d||a==e||b==c||b==d||b==e||c==d||c==e||d==e) continue;
        //判断是否满足竖式的条件 
		else{
     
			m=a*1000+b*100+c*10+d;
            n=a*1000+b*100+e*10+d;
            s=e*10000+d*1000+c*100+a*10+d;
            if (m+n==s)
				printf("兵:%d 炮:%d 马:%d卒:%d 车:%d\n",a,b,c,d,e);
	    }
}

例 4.4

有n个整数,存放在数组a中,设计一个算法从中选出3个正整数组成周长最长的三角形,并输出该三角形的周长,若无法组成三角形就输出0。

穷举出n个整数中选择三条边的所有可能,然后对于每一种可能判断能否组成三角形,在能够组成三角形的前提下,更新最大的周长值。

对应的蛮力法如下:

void solve(int a[],int n){
   
	int i,j,k,len,ma,maxlen=0;
	for (i=0;i<n;i++) for (j=i+1;j<n;j++) for (k=j+1;k<n;k++){
   
		len=a[i]+a[j]+a[k];
		ma=max3(a[i],a[j],a[k]);
		//判断能够穷举出来的一种可能的三条边能否组成一个三角形 
		if (ma<len-
  • 6
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python 的蛮力,也称为暴力,是指通过枚举所有可能的解决方案来解决问题。使用蛮力通常不需要特别的算法知识,但是由于需要枚举所有可能的解决方案,因此其执行速度通常较慢。蛮力通常用于解决小规模问题或作为其他算法的基础。 以下是一个使用 Python 实现的蛮力示例,用于查找一个整数列表中的最大值: ```python def max_num(nums): max_val = float('-inf') for num in nums: if num > max_val: max_val = num return max_val # 示例 nums = [1, 3, 5, 2, 4] print(max_num(nums)) # 输出 5 ``` 在上述示例中,我们通过遍历整数列表 `nums` 来查找最大值。在遍历过程中,我们使用变量 `max_val` 来记录目前为止找到的最大值,并与当前的元素进行比较,如果当前元素比 `max_val` 大,则将 `max_val` 更新为当前元素。最终,函数返回 `max_val`,即为整数列表中的最大值。 ### 回答2: 蛮力(Brute Force)是一种简单却常用的算法思想,也叫暴力搜索。它的基本原理是遍历所有可能的解,逐个进行判断,以找到问题的解。虽然蛮力的效率较低,但在一些问题中,它仍然是一种有效的解决方案。 在Python中,可以使用蛮力解决许多问题。例如,要找到一个列表中的最大数,可以使用蛮力遍历列表的所有元素,并逐个进行比较,最终得到最大的数。 下面是一个简单的用Python实现蛮力找到最大值的例子: ```python def find_max(numbers): if not numbers: # 空列表的情况 return None max_value = numbers[0] # 假设第一个数为最大值 for num in numbers: if num > max_value: # 如果当前数大于最大值 max_value = num # 更新最大值 return max_value ``` 在这个例子中,我们使用一个for循环遍历列表中的每个元素,然后与当前记录的最大值进行比较,如果大于最大值,则更新最大值。 这只是蛮力的一个简单例子,实际应用中可能更复杂。蛮力的优点是简单直观,可以解决许多问题。但它的缺点是效率低下,对于大规模数据或复杂问题,可能需要花费较长的时间。因此,在实际开发中,需要根据具体情况决定是否使用蛮力,或者是否有更有效的算法可供选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值