基础算法(算法——程序的灵魂)

本篇由C语言表示算法

程序=算法+数据结构

一个程序主要包括两方面:

1. 对数据的描述。在程序中要指定用到的数据及这些数据的类型和数据组织形式,这就是数据结构(data structure)。

2. 对操作的描述。要求计算机进行操作的步骤,即算法(algorithm)。

        数据是操作的对象,操作的目的是对数据进行加工处理,以得到期望的结果。在设计一个程序时要综合运用算法、数据结构、程序设计和语言工具四个方面的知识。算法是程序的“灵魂”,数据结构是加工对象,语言是工具,编程需要采用合适的方法。

什么是算法

        为了解决一个问题而采取的方法和步骤,就称为“算法”。程序中的操作语句就是算法的体现。

        方法有优劣之分,一般都希望采用方法简单、运算步骤少的方法。因此,为了有效的解决问题,不仅要保证算法正确,还要考虑算法质量,选择合适的算法。

        计算计算算法可分为两大类:

        数值运算算法,目的是求数值解,此算法往往有现成的模型,可以运用数值分析方法,因对数值运算的算法的研究比较深入,算法比较成熟。

        非数值运算算法,涉及面十分广泛,且种类繁多、要求各异,难以做到全有模型参考,因此只有一些经典的非数值运算算法有现成的、成熟的算法可供参考。许多问题往往需要使用者参考已有的类似的算法思路,重新设计解决特定问题的专门算法。

简单算法举例

解题步骤为算法思路

求1×2×3×4×5

设置两个变量x,y。x代表被乘数,y代表乘数。将每一次相乘的积放入被乘数变量x中。

1. 令 x=1,或写为1=>x   (表示将1存放到变量x中)

2. 令 y=2,或写为2=>y   (表示将2存放到变量y中)

3.  x*y=>x (使x,y相乘,乘积仍放在变量x中)

4.  y+1=>y (使y的值加1)

5.  如果y小于等于5,就返回执行 3. 及其后面的步骤(如条件符合一直重复此步骤);否则算法结束。最后x的值就是5!的值。

PS:如果要得到1、3、5、7、9、11的乘积我们只需将上面步骤略作修改就行。将y=2改为y=3,y+1=>y改为y+2=>y,并限制y小于等于11即可。

在50个学生中,输出成绩在80分之上的学号和成绩

用X代表学生学号,下标i代表第几个学生,X1代表第一个学生学号,Xi代表第i个学生学号,Y代表学生成绩,Y1代表第一个学生成绩,Yi代表第i个学生成绩。

1. 令  1=>i

2. 若Yi>=80则输出Xi和Yi,否则不输出。

3. i+1=>i

4. 若i<=50则返回执行 2.  及其后面的步骤(如条件符合一直重复此步骤);否则算法结束。

PS:变量i代表下标,先令其为1,检查Y1的成绩,然后使i增值为1,一次检查Yi的成绩。

判定2000-2500年中的每一年是否为闰年

闰年的判定条件:能被4整除但不能被100整除,能被400整除。

设置year为被检测的年份

1. 2000=>year

2. 若year不能被4整除,则输出year的值和“不是闰年”,转到 6. 继续执行程序。

3. 若year能被4整除不能被100整除,则输出year值和“是闰年”,转到 6. 继续执行程序。

4. 若year能被4、100整除,还能被400整除,则输出year值和“是闰年”,转到 6. 继续执行程序。

5. 输出year的值和“不是闰年”

6. year+1=>year

7.当year<=2500时,转到 2. 继续执行,否则停止。

求1-1/2+1/3-1/4+...+1/99-1/100的值

sign代表当前处理项前的数值符号,term代表当前项的值,sum代表当前各项的累加和,deno是当前项的分母。

1. sign=1                            //预先设置sign为1(再此程序中sign为1代表加号,-1代表减号)

2. sum=1                            //设sum为1,等同于将第一项加到了sum中,后面因从第二项开始累加

3. deno=2                           //deno为分母的值,第二项分母为2

4. sign=(-1)*sign                //通过乘以(-1)将sign的值在1与-1中转换

5. term=sign*(1/deno)        //term代表当前项的值,deno是分母,sign代表与运算符号

6. sum=sum+term              //进行累加操作

7. deno=deno+1                //使分母值+1

8. 若deno<=100,返回 4. 继续执行,否者算法结束。

给出一个大于或等于3的正整数,判定是否为素数

素数的判定条件:除了1和该数本身外,不能被其他任何整数整除的数。

设定被除数x,除数y

1. 输入x的值

2. y=2

3. x被y除,得到余数z

4. 若z=0,代表x能被y整除,则输出x的值和“不是素数”,算法结束

5. y+1=>y

6. 如果y<=x-1,返回从 3. 开始执行;否则输出x的值和“是素数”,然后结束。

PS:其实被除数只需被2到根号被除数之间的整数整除就可判断是否是素数,即y<=根号x。

算法特性

1. 有穷性。

        一个算法应包含有限的操作步骤,而不能是无限的。“有穷性”往往指“在合理范围之内”。如果写一个需要十年完成运算的算法那它也不是一个有效算法。

2. 确定性。

        算法中每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。即算法的含义应当是唯一的,而不应当产生“歧义性”。所谓“歧义性”,指可以被理解为两种及以上的可能含义。

3. 有零个或多个输入。

        所谓输入是指在执行算法时需要从外界取得必要的信息。

4. 有一个或多个输出。

        算法的目的是为了求解,“解”就是输出。但算法的输出并不一定就是计算机的打印输出或屏幕输出,一个算法得到的结果就是算法的输出,没有输出的算法是没有意义的。

5. 有效性。

        算法中的每一个步骤都应当能有效地执行,并得到确定的结果。

怎样表示一个算法

自然语言

        简单算法举例,就是用自然语言表示的。他通俗易懂,但文字冗长,容易出现歧义。且自然语言描述包含分支与循环的算法时不方便。

流程图

        流程图是用一些图框来表示各种操作,用图形表示算法,直观形象,易于理解。

常用的流程图符号(如下图)

        菱形框的作用是对一个给定条件进行判断,根据给定条件是否成立决定如何执行其后的操作。他有两个出口Y(是)和N(否)。

        注释框并不是流程图中的必要部分,不反应操做和流程,只是对某些框的操作进行补充说明,以提升流程图的可阅读性。

        连接点(小圆圈)是用于将画在不同地方的流程线连接起来。如下图中有两个以①为标志的两节点,他表示这两个点是连接在一起的,实际上他们是同一个点,只是画不下才分开来画。用连接点可以避免流程线交叉或过长,是流程图清晰。

求1×2×3×4×5用流程图表示

        设置两个变量t,i。t代表被乘数,i代表乘数。将每一次相乘的积放入被乘数变量t中。

        下图右边多了一个输出框,将最后结果输出。

在50个学生中,输出成绩在80分之上的学号和成绩用流程图表示

        用n代表学生学号,下标i代表第几个学生,ni代表第i个学生学号,g代表学生成绩,gi代表第i个学生成绩。

        此图左边中没有包括输入50个学生数据的部分,右边包括了输入学生数据部分。

判定2000-2500年中的每一年是否为闰年用流程图表示

        设置year为被检测的年份

求1-1/2+1/3-1/4+...+1/99-1/100的值用流程图表示

        sign代表当前处理项前的数值符号,term代表当前项的值,sum代表当前各项的累加和,deno是当前项的分母。

给出一个大于或等于3的正整数,判定是否为素数用流程图表示

        设定被除数n,除数i

PS:由以上例子可知,一个流程图包括了,表示相应操作的框、带箭头的流程线、框内外必要的说明文字三个部分。流程线必须要画箭头,他是反映流程的先后的。

三种基本结构和改进的流程图
传统流程图的弊端

        传统流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。因此,使用者可以不受限制的使流程随意地转来转去,使流程图变得毫无规律,阅读时需要大量精力去跟踪流程,使人难以理解算法的逻辑。这种如同乱麻一样的算法被称为BS型算法。

        这样的算法是不好的,难以阅读,也难以修改,从而使算法的可靠性和可维护性难以保证。为了提高算法的质量,使算法的设计和阅读方便,必须限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序的进行下去。但是,算法上难免包含一些分支和循环,从而不可能全部由一个个顺序框组成。所以,规定了几种基本结构,然后由这些基本结构按一定规律组成一个算法结构,使算法的质量得到保证和提高。

三种基本结构

1.顺序结构

        虚线框内是一个顺序结构,其中A、B框使顺序执行的。

2.选择结构

        选择结构又称选取结构或分支结构,下图虚线框内是一个选择结构。此结构中必定包含一个判断框。根据给定的条件p是否成立而选择执行A框或B框。

PS:无论条件是否成立,只能执行A、B框之一,不可能都执行。无论执行哪一个框都必须经过b点,然后脱离本选择结构。A或B框中可以有一个是空的,即不执行任何操作。

3.循环结构

        循环结构又称重复结构,即反复执行某一部分的操作。

当行(while型)循环结构

        当给定条件p1成立时,执行A框操作,执行完A后,在判断p1条件是否成立,如果仍然成立,再执行A框操作,如此反复执行A框,直到某一次p1条件不成立,此时从b点脱离循环结构。

        右图为例子,输出5个数,1,2,3,4,5

    

直到型(until型)循环结构

        执行A框操作,再判断p2条件是否成立,如果不成立,再执行A框操作,再判断p2条件是否成立,如不成立,又执行A框操作,如此反复执行A框,直到某一次p2条件成立,此时从b点脱离循环结构。

        右图为例子,输出5个数,1,2,3,4,5

   

以上三种结构有以下共同特征

1. 只有一个入口。

2. 只有一个出口。注:一个判断框有两个出口,而一个结构只有一个出口。

3. 结构内地每一部分都有机会被执行到。

4. 结构内不存在“死循环(无终止的循环)”。

        由基本结构所构成的算法属于“结构化”算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。

        只要具备以上四个特点的都可以作为基本结构。

N-S流程图

PS:个人目前感觉不好用,所以在此简单介绍。

        再此流程图中完全去除了带箭头的流程线。全部算法写在一个矩形框内,该框由一些基本框组成一个很大的框。

顺序结构

选择结构

循环结构

上面3个图中A、B框可以是简单的操作,也可以是三种基本结构之一。

例子:

求5!

输出50名学生中高于80分的学号和成绩

判定闰年

求1-1/2+1/3-1/4+...+1/99-1/100的值

判定素数

        由以上例子可知,N-S图表法比文字表述直观、形象、易于理解;比传统流程图紧凑易画,尤其是它废除了流程线,整个算法结构是由各个基本结构按顺序组成。用N-S表示的算法都是结构化的算法。

        一个结构化的算法是由一些基本结构顺序组成的;在基本结构中不存在向前或向后的跳转,流程的转移只存在与一个基本结构范围之内;一个非结构化的算法可以用一个等价的结构化算法代替,其功能不变。如果一个算法不能分解成若干个基本结构,则它必然不是一个结构化算法。

伪代码

        因为修改流程图麻烦,所以他往往用来表示一个算法,而在设计算法使常使用伪代码。

        伪代码是用介于自然语言和机器语言之间的文字和符号来描述算法。它如同一篇文章一样自上而下写,每行(或几行)表示一个基本操作。书写方便、格式紧凑、修改方便、容易看懂,也便于向计算机语言(即程序)过度。用伪代码写的算法无固定的、严格的语法规则。自需要把意思表达清晰,便于书写和阅读即可,书写的格式要写成清晰易读的形式。

例子:

求5!

begin

        1=>t

        2=>i

        while i<=5

                {

                t*i=>t

                i+1=>i

                }

        print t

end

        由例子可知,伪代码书写格式比较自由,容易表达出设计者的思想,同时算法容易修改。用伪代码很容易写出结构化的算法,但是不如流程图只观,可能出现逻辑上的错误。

计算机语言

        完成一项工作,包括设计算法和实现算法。要得到运算结果,必须实现算法。实现算法的方式可能不止一种。用计算机语言表示算法必须严格遵循所用语言的语法规则。

用C语言实现求5!

#include<stdio.h>

int main()

        {

        int t,i;

        t=1;

        i=2;

        while(i<=5)

                {

                t=t*i;

                i=i+1;

                }

        printf("%d\n",t);

        return 0;

        }

用C语言求1-1/2+1/3-1/4+...+1/99-1/100的值

#include<stdio.h>

int main()

        {

        int sign=1;

        double deno=2.0,sum=1.0, term;        //定义deno、sum、term为双精度型变量

        while(deno<=100)

                {

                sign=-sign;

                term=sign/deno;

                sum=sum+term;

                deno=deno+1;

                }

        printf("%f\n",sum);

        return 0;

        }

        只写出来C程序仍然只是描述算法,并未实现算法。只有运行程序才是实现算法。

结构化程序设计方法

        一个结构化程序就是用计算机语言表示的结构化算法,用三种基本结构组成的程序必然是结构化程序。这种程序便于编写、阅读、修改和维护,这减少了程序出错的机会,提高了程序的可靠性,保证了程序质量。

        结构化程序设计强调了程序设计风格和程序结构化的规范,提倡清晰的结构。结构化程序的基本思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。

保证程序结构化的方法:

1. 自顶向下

        此方法考虑周全,结构清晰,层次分明,作者容易写,读者容易看,修改方便。

2. 逐步细化

        这种方法的过程是将问题求解抽象逐步具体化的过程。便于验证算法的正确性。

3. 模块化设计

        此方法是将一个程序模块,根据不同的功能将其分为若干个子模块,若子模块还大,可以继续划分。程序中的子模块通常用C语言中函数来实现。

        程序中的子模块通常不超过50行,打印输出时不超过一页,这样的规模便于组织,也便于阅读。划分模块时,应注意模块的独立性,即使用一个模块完成一项功能,耦合性越少越好。

4. 结构化编码

        结构化程序设计是用来解决人脑思维能力的局限性和被处理问题的复杂性之间的矛盾。

        设计好结构化算法后,还要善于结构化编码。所谓编码就是将已设计好的算法用计算机语言来表示,即根据已经细化的算法正确的写出计算机程序。结构化的语言都有与其三种基本结构对应的语句。

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2积分福利。2积分福利。2积分福利。2积分福利。2积分福利。2积分福利。2积分福利。2积分福利。2积分福利。2积分福利。2积分福利。 涵盖广泛 精炼的理论讲述搭配大量经典算法示例,学习查询兼而有之。 阐述到位 算法思想、算法实现和完整示例合理搭配,相辅相成。 示例完善 示例分析精准,代码注释精确,每段代码皆可通过编译执行。 计算机技术的发展和普及不仅改变了人们的生活和娱乐方式,也改变了人们的工作方式,这其中最为重要的便是计算机编程技术。现代的设计任务大多通过代码编程交给计算机来完成,其中算法起到了至关重要的作用。可以毫不夸张地说,算法是一切程序设计的灵魂基础。 《C/C++常用算法手册》分3篇,共13章,“第1篇算法基础篇”介绍了算法概述,重点分析了数据结构和基本算法思想;“第2篇算法基本应用篇”详细讲解了算法在排序、查找、数值计算、数论、经典趣题和游戏中的应用;“第3篇算法高级应用篇”讲解了算法的一些高级应用技术,包括在密码学和数据压缩/解压缩中的应用。 《C/C++常用算法手册》知识点覆盖全面、结构安排紧凑、讲解详细、示例丰富。《C/C++常用算法手册》对每一个知识点都给出了相应的算法及应用示例。虽然这些例子都是以C语言来编写的,但是算法并不局限于C语言。如果读者采用其他编程语言,例如C++、C#、VB、Java等,根据其语法格式进行适当的修改即可。 《C/C++常用算法手册 》主要定位于有一定C/C++语言编程基础、想通过学习算法与数据结构提升编程水平的读者,也可作为具有一定编程经验的程序员以及大中专院校学生学习数据结构和算法的参考书。 第1篇 算法基础篇 1 第1章 算法概述 2 1.1 什么是算法 2 1.2 算法的发展历史 3 1.3 算法的分类 4 1.4 算法相关概念的区别 4 1.5 算法的表示 5 1.5.1 自然语言表示 5 1.5.2 流程图表示 6 1.5.3 N-S图表示 7 1.5.4 伪代码表示 7 1.6 算法的性能评价 8 1.7 算法实例 9 1.7.1 查找数字 9 1.7.2 创建项目 11 1.7.3 编译执行 12 1.8 算法的新进展 13 1.9 小结 14 第2章 数据结构 15 2.1 数据结构概述 15 2.1.1 什么是数据结构 15 2.1.2 数据结构中的基本概念 16 2.1.3 数据结构的内容 16 2.1.4 数据结构的分类 18 2.1.5 数据结构的几种存储方式 18 2.1.6 数据类型 19 2.1.7 常用的数据结构 20 2.1.8 选择合适的数据结构解决实际问题 21 2.2 线性表 21 2.2.1 什么是线性表 21 2.2.2 线性表的基本运算 22 2.3 顺序表结构 23 2.3.1 准备数据 23 2.3.2 初始化顺序表 24 2.3.3 计算顺序表长度 24 2.3.4 插入结点 24 2.3.5 追加结点 25 2.3.6 删除结点 25 2.3.7 查找结点 25 2.3.8 显示所有结点 26 2.3.9 顺序表操作示例 26 2.4 链表结构 30 2.4.1 什么是链表结构 30 2.4.2 准备数据 31 2.4.3 追加结点 31 2.4.4 插入头结点 33 2.4.5 查找结点 33 2.4.6 插入结点 34 2.4.7 删除结点 35 2.4.8 计算链表长度 36 2.4.9 显示所有结点 36 2.4.10 链表操作示例 37 2.5 栈结构 41 2.5.1 什么是栈结构 41 2.5.2 准备数据 42 2.5.3 初始化栈结构 42 2.5.4 判断空栈 43 2.5.5 判断满栈 43 2.5.6 清空栈 43 2.5.7 释放空间 44 2.5.8 入栈 44 2.5.9 出栈 44 2.5.10 读结点数据 45 2.5.11 栈结构操作示例 45 2.6 队列结构 48 2.6.1 什么是队列结构 48 2.6.2 准备数据 49 2.6.3 初始化队列结构 49 2.6.4 判断空队列 50 2.6.5 判断满队列 50 2.6.6 清空队列 50 2.6.7 释放空间 51 2.6.8 入队列 51 2.6.9 出队列 51 2.6.10 读结点数据 52 2.6.11 计算队列长度 52 2.6.12 队列结构操作示例 53 2.7 树结构 56 2.7.1 什么是树结构 56 2.7.2 树的基本概念 56 2.7.3 二叉树 57 2.7.4 准备数据 61 2.7.5 初始化二叉树 61 2.7.6 添加结点 62 2.7.7 查找结点 63 2.7.8 获取左子树 64 2.7.9 获取右子树 64 2.7.10 判断空树 65 2.7.11 计算二叉树深度 65 2.7.12 清空二叉树 65 2.7.13 显示结点数据 66 2.7.14 遍历二叉树 66 2.7.15 树结构操作示例 68 2.8 图结构 71 2.8.1 什么是图结构 71 2.8.2 图的基本概念 72 2.8.3 准备数据 76 2.8.4 创建图 78 2.8.5 清空图 79 2.8.6 显示图 79 2.8.7 遍历图 80 2.8.8 图结构操作示例 81 2.9 小结 84 第3章 基本算法思想 85 3.1 常用算法思想概述 85 3.2 穷举算法思想 85 3.2.1 穷举算法基本思想 86 3.2.2 穷举算法示例 86 3.3 递推算法思想 88 3.3.1 递推算法基本思想 88 3.3.2 递推算法示例 88 3.4 递归算法思想 90 3.4.1 递归算法基本思想 90 3.4.2 递归算法示例 90 3.5 分治算法思想 92 3.5.1 分治算法基本思想 92 3.5.2 分治算法示例 92 3.6 概率算法思想 96 3.6.1 概率算法基本思想 96 3.6.2 概率算法示例 97 3.7 小结 98 第2篇 算法基本应用篇 99 第4章 排序算法 100 4.1 排序算法概述 100 4.2 冒泡排序法 101 4.2.1 冒泡排序算法 101 4.2.2 冒泡排序算法示例 102 4.3 选择排序法 104 4.3.1 选择排序算法 104 4.3.2 选择排序算法示例 105 4.4 插入排序法 107 4.4.1 插入排序算法 107 4.4.2 插入排序算法示例 108 4.5 Shell排序法 110 4.5.1 Shell排序算法 110 4.5.2 Shell排序算法示例 111 4.6 快速排序法 113 4.6.1 快速排序算法 113 4.6.2 快速排序算法示例 114 4.7 堆排序法 116 4.7.1 堆排序算法 116 4.7.2 堆排序算法示例 121 4.8 合并排序法 123 4.8.1 合并排序算法 123 4.8.2 合并排序算法示例 126 4.9 排序算法的效率 129 4.10 排序算法的其他应用 130 4.10.1 反序排序 130 4.10.2 字符串数组的排序 132 4.10.3 字符串的排序 135 4.11 小结 137 第5章 查找算法 138 5.1 查找算法概述 138 5.2 顺序查找 138 5.2.1 顺序查找算法 139 5.2.2 顺序查找操作示例 139 5.3 折半查找 141 5.3.1 折半查找算法 141 5.3.2 折半查找操作示例 142 5.4 数据结构中的查找算法 145 5.4.1 顺序表结构中的查找算法 145 5.4.2 链表结构中的查找算法 148 5.4.3 树结构中的查找算法 151 5.4.4 图结构中的查找算法 152 5.5 小结 153 第6章 基本数学问题 154 6.1 判断闰年 154 6.2 多项式计算 156 6.2.1 —维多项式求值 156 6.2.2 二维多项式求值 158 6.2.3 多项式乘法 160 6.2.4 多项式除法 161 6.3 随机数生成算法 164 6.4 复数运算 171 6.4.1 简单的复数运算 172 6.4.2 复数的幂运算 174 6.4.3 复指数运算 176 6.4.4 复对数运算 177 6.4.5 复正弦运算 178 6.4.6 复余弦运算 179 6.5 阶乘 180 6.6 计算π的近似值 183 6.6.1 割圆术 183 6.6.2 蒙特卡罗算法 185 6.6.3 级数公式 187 6.7 矩阵运算 190 6.7.1 矩阵加法 190 6.7.2 矩阵减法 191 6.7.3 矩阵乘法 193 6.8 方程求解 195 6.8.1 线性方程求解——高斯消元法 195 6.8.2 非线性方程求解——二分法 200 6.8.3 非线性方程求解——牛顿迭代法 202 6.9 小结 205 第7章 复杂的数值计算算法 206 7.1 拉格朗日插值 206 7.1.1 拉格朗日插值算法 206 7.1.2 拉格朗日插值示例 207 7.2 数值积分 210 7.2.1 数值积分算法 210 7.2.2 数值积分示例 211 7.3 开平方 213 7.3.1 开平方算法 213 7.3.2 开平方示例 213 7.4 极值问题的求解算法 215 7.4.1 极值求解算法 215 7.4.2 极值求解示例 217 7.5 特殊函数的计算算法 221 7.5.1 伽玛函数 221 7.5.2 贝塔函数 224 7.5.3 正弦积分函数 228 7.5.4 余弦积分函数 231 7.5.5 指数积分函数 235 7.6 小结 239 第8章 经典数据结构问題 240 8.1 动态数组排序 240 8.1.1 动态数组的存储和排序 240 8.1.2 动态数组排序示例 241 8.2 约瑟夫环 243 8.2.1 简单约瑟夫环算法 243 8.2.2 简单约瑟夫环求解 245 8.2.3 复杂约瑟夫环算法 247 8.2.4 复杂约瑟夫环求解 248 8.3 城市之间的最短总距离 250 8.3.1 最短总距离算法 250 8.3.2 最短总距离求解 253 8.4 最短路径 257 8.4.1 最短路径算法 258 8.4.2 最短路径求解 260 8.5 括号匹配 265 8.5.1 括号匹配算法 265 8.5.2 括号匹配求解 267 8.6 小结 270 第9章 数论问题 271 9.1 数论 271 9.1.1 数论概述 271 9.1.2 数论的分类 272 9.1.3 初等数论 273 9.1.4 基本概念 273 9.2 完全数 274 9.2.1 完全数概述 274 9.2.2 计算完全数算法 275 9.3 亲密数 277 9.3.1 亲密数概述 277 9.3.2 计算亲密数算法 277 9.4 水仙花数 280 9.4.1 水仙花数概述 280 9.4.2 计算水仙花数算法 281 9.5 自守数 283 9.5.1 自守数概述 283 9.5.2 计算自守数算法 284 9.6 最大公约数 287 9.6.1 计算最大公约数算法——搌转相除法 287 9.6.2 计算最大公约数算法一一Stein算法 288 9.6.3 计算最大公约数示例 289 9.7 最小公倍数 290 9.8 素数 292 9.8.1 素数概述 292 9.8.2 计算素数算法 292 9.9 回文素数 294 9.9.1 回文素数概述 294 9.9.2 计算回文素数算法 294 9.10 平方回文数 297 9.10.1 平方回文数概述 297 9.10.2 计算平方回文数算法 297 9.11 分解质因数 299 9.12 小结 301 第10 章算法经典趣题 302 0. .l 百钱买百鸡 302 10.1.1 百钱买百鸡算法 302 10.1.2 百钱买百鸡求解 303 10.2 五家共井 304 10.2.1 五家共井算法 304 10.2.2 五家共井求解 305 10.3 鸡兔同笼 307 10.3.1 鸡兔同笼算法 307 10.3.2 鸡兔同笼求解 308 10.4 猴子吃桃 308 10.4.1 猴子吃桃算法 308 10.4.2 猴子吃桃求解 309 10.5 舍罕王赏麦 310 10.5.1 舍罕王赏麦问题 310 10.5.2 舍罕王赏麦求解 311 10.6 汉诺塔 312 10.6.1 汉诺塔算法 312 10.6.2 汉诺塔求解 314 10.7 窃贼问题 315 10.7.1 窃贼问题算法 315 10.7.2 窃贼问题求解 317 10.8 马踏棋盘 320 10.8.1 马踏棋盘算法 320 10.8.2 马踏棋盘求解 321 10.9 八皇后问题 323 10.9.1 八皇后问题算法 324 10.9.2 八皇后问题求解 325 10.10 寻找假银币 327 10.10.1 寻找假银币算法 327 10.10.2 寻找假银币求解 329 10.11 青蛙过河 331 10.11.1 青蛙过河算法 331 10.11.2 青蛙过河求解 333 10.12 三色旗 335 10.12.1 三色旗算法 335 10.12.2 三色旗求解 337 10.13 渔夫捕鱼 339 10.13.1 渔夫捕鱼算法 339 10.13.2 渔夫捕魚求解 340 10.14 爱因斯坦的阶梯 341 10.14.1 爱因斯坦的阶梯算法 341 10.14.2 爱因斯坦的阶梯求解 342 10.15 兔子产仔 342 10.15.1 兔子产仔算法 343 10.15.2 兔子产仔求解 343 10.16 常胜将军 344 10.16.1 常胜将军算法 344 10.16.2 常胜将军求解 345 10.17 新郎和新娘 346 10.17.1 新郎和新娘算法 347 10.17.2 新郎和新娘求解 348 10.18 三色球 349 10.18.1 三色球算法 349 10.18.2 三色球求解 350 10.19 小结 351 第11章 游戏中的算法 352 11.1 洗扑克牌 352 11.1.1 洗扑克牌算法 352 11.1.2 洗扑克牌示例 353 11.2 取火柴游戏 356 11.2.1 取火柴游戏算法 356 11.2.2 取火柴游戏示例 357 11.3 10点半 358 11.3.1 10点半算法 358 11.3.2 10点半游戏示例 363 11.4 生命游戏 368 11.4.1 生命游戏的原理 368 11.4.2 生命游戏的算法 369 11.4.3 生命游戏示例 371 11.5 小结 376 第3篇 算法高级应用篇 377 第12章 密码学算法 378 12.1 密码学概述 378 12.1.1 密码学的发展 378 12.1.2 密码学的基本概念 379 12.1.3 柯克霍夫斯原则 379 12.1.4 经典密码学算法 380 12.2 换位加密解密 381 12.2.1 换位加密解密算法 381 12.2.2 换位加密解密算法示例 383 12.3 替换加密解密 386 12.3.1 替换加密解密算法 386 12.3.2 替换加密解密算法示例 388 12.4 位加密解密 389 12.4.1 位加密解密算法 390 12.4.2 位加密解密算法示例 391 12.5 一次一密加密解密算法 392 12.5.1 一次一密加密解密算法 392 12.5.2 一次一密加密解密算法示例 394 12.6 小结 396 第13章 压缩与解压缩算法 397 13.1 压缩与解压缩概述 397 13.1.1 压缩与解压缩分类 397 13.1.2 典型的压缩解压缩算法 397 13.2 压缩算法 398 13.3 解压缩算法 401 13.4 压缩/解压缩示例 404 13.5 小结 406
30个算法程序整理,需要的同学们可以下载啦! 30个算法程序整理~川理-鹏\BP神经网络分类.pdf, 409828 , 2017-09-07 30个算法程序整理~川理-鹏\BP神经网络评价.pdf, 431981 , 2017-09-10 30个算法程序整理~川理-鹏\BP神经网络,预测.pdf, 156242 , 2017-09-10 30个算法程序整理~川理-鹏\GM(1,1)预测.pdf, 134683 , 2017-09-07 30个算法程序整理~川理-鹏\RBF神经网络.pdf, 616956 , 2017-09-10 30个算法程序整理~川理-鹏\Read Me.txt, 582 , 2017-09-12 30个算法程序整理~川理-鹏\三次指数平滑法.pdf, 93869 , 2017-09-10 30个算法程序整理~川理-鹏\人员疏散-元胞自动机.pdf, 278402 , 2017-09-10 30个算法程序整理~川理-鹏\偏最小二乘法.pdf, 624380 , 2017-09-08 30个算法程序整理~川理-鹏\关联分析+优势分析.pdf, 691257 , 2017-09-07 30个算法程序整理~川理-鹏\因子分析评价模型.p df, 302027 , 2017-09-07 30个算法程序整理~川理-鹏\城市规划-元胞自动机.pdf, 336276 , 2017-09-10 30个算法程序整理~川理-鹏\基于形态学的权重自适应图像去噪.pdf, 910283 , 2017-09-08 30个算法程序整理~川理-鹏\多单因素方差分析.pdf, 317006 , 2017-09-07 30个算法程序整理~川理-鹏\小波神经网络.pdf, 545875 , 2017-09-10 30个算法程序整理~川理-鹏\指派优化问题(0,1整数规划).pdf, 583624 , 2017-09-10 30个算法程序整理~川理-鹏\支持向量机.pdf, 770026 , 2017-09-07 30个算法程序整理~川理-鹏\最小生成树.pdf, 668256 , 2017-09-10 30个算法程序整理~川理-鹏\模拟退火最短路问题.pdf, 840666 , 2017-09-09 30个算法程序整理~川理-鹏\模糊聚类.pdf, 282470 , 2017-09-07 30个算法程序整理~川理-鹏\熵权法.pdf, 152382 , 2017-09-07 30个算法程序整理~川理-鹏\牛顿插值.pdf, 236217 , 2017-09-10 30个算法程序整理~川理-鹏\空间分布图.pdf, 212741 , 2017-09-08 30个算法程序整理~川理-鹏\简单图像处理.pdf, 414725 , 2017-09-08 30个算法程序整理~川理-鹏\粒子群算法-函数寻优.pdf, 664981 , 2017-09-09 30个算法程序整理~川理-鹏\蒙特卡罗非线性规划求解.pdf, 514421 , 2017-09-09 30个算法程序整理~川理-鹏\遗传算法.pdf, 613569 , 2017-09-09 30个算法程序整理~川理-鹏\遗传算法GA-最短路问题.pdf, 534278 , 2017-09-10 30个算法程序整理~川理-鹏\量子遗传算法.pdf, 343005 , 2017-09-10 30个算法程序整理~川理-鹏\非线性整数规划.pdf, 71362 , 2017-09-08 30个算法程序整理~川理-鹏\非线性最小二乘优化问题.pdf, 362554 , 2017-09-09 30个算法程序整理~川理-鹏, 0 , 2017-09-10
### 回答1: 卫兵布置问题是指在一个 $n\times m$ 的矩阵中,放置若干个卫兵,使得每行和每列都至少有一个卫兵,并且卫兵之间不能相互攻击,即同行、同列或同一对角线上不能有两个及以上的卫兵。求解放置卫兵的方案数。 这个问题可以用搜索算法来解决。我们可以用一个二维数组 $board$ 来表示矩阵,其中 $board_{i,j}=1$ 表示该位置已经放置了卫兵,$board_{i,j}=0$ 表示该位置还没有放置卫兵。我们可以从第一行开始,枚举每个位置放置卫兵或不放置卫兵,然后递归到下一行,直到最后一行。如果在最后一行放置了卫兵,那么我们就找到了一个合法的方案;否则,我们就需要回溯到上一行,重新枚举该行的下一个位置。 具体实现细节可以参考下面的代码: ### 回答2: 卫兵布置问题是一个典型的算法程序设计问题,通常是在一定区域内布置一定数量的卫兵,使得每个区域都能够被卫兵所覆盖。 首先,我们可以采用贪心算法来解决这个问题。贪心算法的基本思想是,每次都选择当前情况下最优解,以期望得到全局最优解。 具体实现上,可以按照以下步骤进行: 1. 将要布置的区域按照一定的规则排序,比如按照面积从大到小排序。 2. 选择第一个区域进行布置,将一个卫兵放置在这个区域的中心位置。 3. 从第二个区域开始,遍历每个区域,如果该区域与已布置的卫兵的覆盖区域没有交集,则在该区域的中心位置再放置一个卫兵。 4. 不断循环3,直至所有的区域都被遍历完毕。 贪心算法的时间复杂度为O(nlogn),其中n为区域的个数。该算法保证了每个区域都能够被卫兵覆盖,但并不能保证卫兵的数量最少。 如果需要保证卫兵的数量最少,我们可以使用更复杂的算法,比如动态规划算法。动态规划算法通常包含以下几个步骤: 1. 定义状态:设f(i)表示前i个区域所需要的最少卫兵数量。 2. 初始化状态:f(1)为1,即第一个区域需要一个卫兵。 3. 状态转移方程:f(i) = min{f(j) + 1},其中j < i且第j个区域的覆盖范围可以覆盖第i个区域。 4. 求解最优解:最后返回f(n)即为最终结果。 动态规划算法的时间复杂度为O(n^2),需要使用一个数组来保存中间结果。这种算法能够保证卫兵的数量最少,但相对于贪心算法来说更加复杂一些。 综上所述,卫兵布置问题在算法程序设计中可以采用贪心算法或动态规划算法来求解,具体的选择取决于问题的要求和时间复杂度的需求。 ### 回答3: 卫兵布置问题是指如何在给定的一组区域中,安排卫兵的位置,以实现最佳的防御效果。 解决卫兵布置问题的算法程序设计可以采用以下步骤: 首先,需要分析给定的区域,了解每个区域的特点和可能的入侵路径。可以将区域抽象为一个二维矩阵,每个位置表示一个区域。 其次,确定卫兵的数量和他们的限制条件。这包括卫兵的总数目、布置的范围以及相邻卫兵之间的最小距离等。 接下来,根据防御策略设计相应的算法。一种常见的算法是贪婪算法,即每次选择一个最优的位置来布置卫兵,直到卫兵数量达到要求或不能再继续放置为止。该算法可以根据区域的特点和入侵路线来选择最佳的位置。另一种常用的算法是回溯算法,通过递归地尝试不同的布置方式,找到最佳的卫兵布置方案。 最后,实现并测试设计好的算法。可以根据给定区域的大小和要求的卫兵数量来生成测试样例,并通过结果验证算法的正确性和有效性。 总之,卫兵布置问题是一种优化问题,需要通过谨慎的分析和设计来找到最佳的解决方案。算法程序设计可以通过贪婪算法、回溯算法等方法来解决此类问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值