计算机编程常用算法
- 格式:doc
- 大小:223.00 KB
- 文档页数:55
计算机考试必备公式与算法在计算机考试中,掌握一些基本的公式与算法是非常重要的。
这些公式与算法可以帮助我们解决各种计算机科学问题,提高解题的效率。
本文将从公式和算法两个方面来介绍一些在计算机考试中必备的内容。
一、计算机考试必备公式1. 算术运算公式在计算机编程中,我们经常需要进行各种算术运算,如加法、减法、乘法和除法。
以下是一些常用的算术运算公式:加法:a + b = c减法:a - b = c乘法:a × b = c除法:a ÷ b = c2. 平均值公式计算平均值在计算机考试中常会用到,以下是计算平均值的公式:平均值:avg = (a1 + a2 + a3 + ... + an) / n其中a1、a2、a3等为数据集中的各个数值,n为数据集的数量。
3. 阶乘公式阶乘在计算机科学中也是常用的概念,以下是阶乘的公式:n的阶乘:n! = n × (n-1) × (n-2) × ... × 1其中n为要计算阶乘的数。
4. 斐波那契数列公式斐波那契数列是一个非常经典的数列,在计算机考试中经常会考察该数列的计算。
以下是斐波那契数列的公式:第n个斐波那契数:F(n) = F(n-1) + F(n-2)其中F(1) = 1,F(2) = 1。
5. 指数幂公式指数幂在计算机科学中也是常用的,以下是指数幂的公式:a的b次方:a^b = a × a × a × ... × a (共b个a相乘)其中a为底数,b为幂。
以上是一些在计算机考试中常用的公式,掌握这些公式可以帮助我们更好地解题。
二、计算机考试必备算法除了公式外,一些常见的算法也是在计算机考试中必备的。
以下介绍几个常用的算法:1. 线性搜索算法线性搜索算法是一种简单直观的搜索算法。
它的基本思想是逐个比较待搜索的元素与目标元素,直到找到匹配或搜索完所有元素。
2. 二分搜索算法二分搜索算法是一种高效的搜索算法,适用于已排序的数据集。
C语言常用算法程序汇总C语言是一门广泛应用于计算机编程的语言,具有较高的效率和灵活性。
在C语言中,常见的算法程序包括排序算法、查找算法、递归算法等等。
以下是一些常用的C语言算法程序的汇总:1.排序算法:-冒泡排序:通过多次迭代比较相邻元素并交换位置,将最大的元素逐渐移动到正确的位置。
-插入排序:将待排序的元素与已排序的部分依次比较并插入到正确的位置。
-选择排序:每次从待排序的元素中选择最小的元素并与已排序的部分交换位置。
-快速排序:通过选择一个基准元素,将数组划分为两个子数组进行递归排序。
2.查找算法:-顺序查找:逐个比较数组中的元素,直到找到目标元素或到数组末尾。
-二分查找:通过比较目标元素与数组中间元素的大小,逐步缩小范围,直到找到目标元素。
-哈希查找:通过散列函数将目标元素映射到哈希表的索引位置进行查找。
3.递归算法:-阶乘:通过递归调用自身计算一个正整数的阶乘。
-斐波那契数列:通过递归调用自身计算斐波那契数列的第n个数。
-二叉树遍历:通过递归调用自身遍历二叉树的各个节点。
4.图算法:- 最短路径算法:如Dijkstra算法和Floyd算法,用于计算图中两个节点之间的最短路径。
-拓扑排序:通过对有向无环图进行排序,使得所有的边从排在前面的节点指向排在后面的节点。
- 最小生成树:如Prim算法和Kruskal算法,用于找到图中连接所有节点的最小子树。
5.动态规划:-最长公共子序列:通过寻找两个字符串中的最长公共子序列,解决字符串匹配问题。
-背包问题:通过动态规划解决在给定容量下选取物品使得总价值最大的问题。
-最大子序列和:通过动态规划解决一个数组中选取连续子序列使得和最大的问题。
以上只是一些C语言中常用的算法程序的汇总,实际上,还有很多其他的算法,如逆波兰表达式、霍夫曼编码、最小割等等。
通过学习这些算法,可以更好地理解C语言的应用和开发。
常用算法与编程技巧在计算机编程中,算法和编程技巧是非常重要的。
算法是指一系列解决问题的步骤和方法,而编程技巧则是指通过合适的代码和技术手段来实现算法。
在下面的文章中,我将介绍一些常用的算法和编程技巧,帮助你提高编程能力和解决实际问题。
一、常用算法1.排序算法:常用的排序算法包括冒泡排序、快速排序、插入排序和选择排序。
排序算法可以对数据进行排序,使其按照一定的规则排列。
2.查找算法:常用的查找算法有线性查找和二分查找。
查找算法可以在一个给定的数据集中查找指定的值。
3.图算法:图算法用于解决图问题,如最短路径问题和最小生成树问题。
4.动态规划算法:动态规划算法用于解决需要考虑多个子问题的问题,通过将问题分解成更小的子问题来求解。
5.贪心算法:贪心算法通过每次选择当前最优解来解决问题,但不能保证获得全局最优解。
6.分治算法:分治算法将问题分解成更小的子问题,通过解决子问题来解决原始问题。
二、编程技巧1.代码复用:通过将常用的代码提取成函数或类来实现代码的复用。
这样可以减少代码重复,提高编程效率。
2.注释和文档:编写清晰的注释和文档可以帮助他人理解你的代码,并且提高代码的可读性。
这对于团队合作和代码维护非常重要。
3.错误处理和异常处理:编程中通常会遇到一些错误和异常情况,良好的错误处理和异常处理可以让程序更加健壮和稳定。
4.编码风格:编码风格是指使用一致的命名规则、缩进、空格和符号来编写代码。
良好的编码风格可以提高代码的可读性,减少错误。
5.调试技巧:调试是解决问题的重要步骤,可以使用断点、日志输出和逐步执行来调试代码。
良好的调试技巧可以加快问题的定位和解决。
6.性能优化:优化代码的性能可以提高程序的运行速度和响应时间。
可以使用一些技巧如合理的数据结构选择、算法优化和代码重构来实现性能优化。
7.版本管理:使用版本管理工具来管理代码的版本和变更记录。
这样可以方便地回滚到之前的版本,解决冲突和合并代码。
总结常用的算法和编程技巧对于提高编程能力和解决实际问题是非常重要的。
计算机编程常用算法1.排序算法:排序是一项基本操作,常用的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。
这些算法用于对一组数据进行排序,以便更方便地进行查找和处理。
2.查找算法:查找是另一项常用操作,常用的查找算法包括线性查找、二分查找、哈希查找等。
这些算法用于在一组数据中寻找指定的元素。
3. 图算法:图算法用于处理图数据结构相关的问题,常用的图算法包括深度优先(DFS)、广度优先(BFS)、最小生成树算法(Prim和Kruskal算法)、最短路径算法(Dijkstra算法和Floyd-Warshall算法)等。
4.动态规划:动态规划是一种解决最优化问题的方法,常用于求解最长公共子序列、背包问题等。
动态规划通过将问题分解为子问题,并保存子问题的解,以便在需要时重复利用,从而降低问题的复杂度。
5.贪心算法:贪心算法是一种通过局部最优选择来得到全局最优解的方法,常用于求解最小生成树问题、哈夫曼编码等。
贪心算法每次选择最优的局部解,然后继续下一步,直到得到全局最优解。
6.回溯算法:回溯算法用于求解排列、组合、子集等问题。
回溯算法通过尝试不同的选择,并回溯到上一步,直到找到解。
7. 字符串匹配算法:字符串匹配是一项常见的操作,常用的字符串匹配算法包括暴力匹配、KMP算法、Boyer-Moore算法等。
这些算法用于在一个字符串中寻找另一个字符串,并返回匹配的位置或结果。
8. 最大流算法:最大流算法用于解决网络流问题,常用的最大流算法包括Ford-Fulkerson算法、Edmonds-Karp算法、Dinic算法等。
9. 最小割算法:最小割算法用于分割网络中的最小割,常用的最小割算法包括Ford-Fulkerson算法、Karger算法等。
10.基本数据结构:编程中常用的基本数据结构包括数组、链表、栈、队列、树、图等,对这些数据结构的操作和算法是编程中的基础。
以上只是一些常见的编程算法,实际上还有许多其他的算法,如最长递增子序列、快速幂、拓扑排序等。
java业务的常用算法,应用场景Java业务的常用算法及应用场景算法是计算机科学的基础,它可以解决各种计算问题。
在Java编程中,算法的应用非常广泛。
本文将介绍Java业务中常用的算法以及它们的应用场景。
一、排序算法排序算法是最基本、最常用的算法之一。
在Java业务中,需要对数据进行排序的场景非常多。
例如,对数组或集合中的元素按照某个属性进行排序,对数据库中的记录按照某个字段进行排序等等。
常用的排序算法有冒泡排序、选择排序、插入排序、快速排序等。
这些算法各有特点,可以根据排序需求的不同选择合适的算法。
二、查找算法查找算法用于在一组数据中查找目标元素。
在Java业务中,查找算法的应用场景也很多。
例如,根据关键字从数据库中查询记录,查找集合中满足条件的元素等等。
常用的查找算法有线性查找、二分查找等。
线性查找适用于无序数据,而二分查找适用于有序数据。
三、图算法图算法用于解决图结构相关的问题。
在Java业务中,图算法可以应用于各种场景。
例如,社交网络中的好友关系图分析,行程规划中的路径搜索等等。
常用的图算法有广度优先搜索、深度优先搜索、最短路径算法等。
这些算法可以帮助我们理解和分析复杂的图结构,解决实际问题。
四、贪心算法贪心算法是一种通过局部最优选择来达到全局最优的算法。
在Java业务中,贪心算法可以用于解决各种优化问题。
例如,资源分配中的任务调度,机票价格计算中的最优组合等等。
贪心算法的核心思想是不断做出局部最优选择,并且希望这些选择最终能够达到全局最优。
虽然贪心算法不一定能够得到最优解,但在许多实际问题中,它的效果是非常好的。
五、动态规划算法动态规划算法是一种将复杂问题分解成简单子问题的思想。
在Java业务中,动态规划算法可以用于解决各种优化问题。
例如,最短路径问题、背包问题、字符串匹配问题等等。
动态规划算法的基本思路是通过保存已计算过的结果,避免重复计算,从而大大提高算法效率。
它常常用于求解具有最优子结构的问题。
现代计算机常用数据结构和算法现代计算机科学中常用的数据结构和算法非常多,下面是一些核心且广泛应用于软件开发、数据库系统、操作系统、编译器设计、网络编程、机器学习以及其他计算密集型任务中的数据结构与算法:常用数据结构:1. 数组:线性存储结构,通过索引访问元素,支持随机访问。
2. 链表:包括单向链表、双向链表和循环链表,通过指针链接元素,插入删除操作灵活但不支持随机访问。
3. 栈(Stack):后进先出(LIFO)的数据结构,常用于函数调用栈、表达式求值等。
4. 队列(Queue):先进先出(FIFO)的数据结构,适用于处理任务排队、广度优先搜索等问题。
5. 哈希表(Hash Table):基于散列函数实现快速查找,用于实现关联数组、缓存、唯一性检查等功能。
6. 树:如二叉树(包括二叉查找树、AVL树、红黑树)、B树、B+树、Trie树等,用于搜索、排序、文件系统索引等。
7. 图(Graphs):表示节点集合以及节点之间的关系,常见于社交网络分析、路径规划等领域。
8. 堆(Heap):一种特殊的树形数据结构,分为最大堆和最小堆,用于优先队列、堆排序等。
9. 集合与映射(Set & Map):无序不重复元素的集合和键值对结构,提供高效查找、插入和删除操作。
常用算法:1. 排序算法:快速排序、归并排序、冒泡排序、选择排序、插入排序、堆排序等。
2. 搜索算法:线性搜索、二分查找、插值搜索、哈希查找、深度优先搜索(DFS)、广度优先搜索(BFS)等。
3. 图算法:最短路径算法(Dijkstra、Bellman-Ford、Floyd-Warshall),拓扑排序,最小生成树算法(Prim、Kruskal)等。
4. 动态规划:解决具有重叠子问题和最优子结构的问题,如背包问题、最长公共子序列(LCS)等。
5. 贪心算法:在每一步都采取当前看来最优的选择,如霍夫曼编码、活动选择问题等。
6. 回溯算法和分支限界法:用于解决组合优化问题,如八皇后问题、旅行商问题等。
c语言经典算法解析C语言作为一种广泛使用的编程语言,拥有许多经典算法,这些算法不仅在解决实际问题上非常高效,而且对于理解计算机科学的基本原理也至关重要。
本文将介绍一些C语言中常见的经典算法,并解析其实现原理。
1. 排序算法:排序是计算机科学中最基本的问题之一,C语言提供了多种排序算法的实现,例如冒泡排序、选择排序、插入排序、快速排序等。
这些算法以不同的方式对元素进行比较和交换,最终将数据按照一定的顺序排列。
2. 查找算法:查找算法用于在给定数据集中寻找特定的值。
C语言中常见的查找算法包括线性查找、二分查找、哈希查找等。
这些算法的实现原理各不相同,但都能在不同的数据规模下高效地找到目标值。
3. 图算法:图是由节点和边组成的一种数据结构,图算法用于解决与图相关的问题,例如最短路径查找、拓扑排序、最小生成树等。
C语言中可以使用邻接矩阵或邻接表等数据结构来表示图,并通过深度优先搜索或广度优先搜索等算法来进行相应的操作。
4. 字符串匹配算法:字符串匹配算法用于在一个长字符串中查找某个子串出现的位置。
常见的算法包括朴素字符串匹配算法、KMP算法、Boyer-Moore算法等。
这些算法通过不同的方式在给定的字符串中寻找匹配,从而提高查找的效率。
5. 动态规划算法:动态规划算法用于解决有重叠子问题和最优子结构特征的问题。
C语言中常用的动态规划算法有背包问题、最长公共子序列问题、最短路径问题等。
这些算法通过将大问题分解为小问题,并使用查表或记忆化搜索等技术来避免重复计算,从而提高算法的效率。
以上仅是C语言中一些经典算法的简要介绍和解析。
随着计算机科学的不断发展,还有许多其他算法可以探索和应用。
掌握这些经典算法的原理和实现有助于提高编程技能,同时也能够帮助理解计算机科学的核心概念。
通过不断学习和实践,我们可以在编程中灵活运用这些算法,解决实际问题。
C语言常用的入门算法C语言是一门广泛应用于计算机科学和软件开发领域的编程语言。
作为一门通用的编程语言,C语言提供了丰富的算法和数据结构库,使得开发人员能够解决各种不同类型的问题。
下面是C语言入门算法的一些常见示例:1.排序算法:-冒泡排序:通过不断比较相邻的元素,并交换它们的位置来排序。
-插入排序:将未排序的元素逐一插入已排序的列表中。
-选择排序:通过重复找到最小的元素并将其放置在已排序序列的末尾来排序。
-快速排序:通过选择一个基准元素,将列表划分成较小和较大的两部分,然后对其进行递归排序。
-归并排序:将列表分成较小的子列表,然后逐个合并这些子列表。
2.查找算法:-顺序查找:逐个比较列表中的元素,直到找到匹配的元素为止。
-二分查找:在已排序的列表中通过递归或循环的方式,将待查找的元素与中间元素进行比较,以确定它可能在哪一半中。
-哈希表:通过散列函数将元素映射到一个较小的固定大小的数组(哈希表)中,并通过索引快速查找。
3.字符串算法:-字符串长度:使用循环逐个字符遍历,直到遇到字符串结束符'\0'为止,统计字符个数。
-字符串比较:逐个字符比较两个字符串的对应位置,直到遇到不相等的字符或字符串结束符。
-字符串拼接:将一个字符串的字符逐个复制到另一个字符串的末尾,直到遇到字符串结束符'\0'。
-子字符串匹配:在一个较长的字符串中查找一个较短的子字符串,常用的算法有朴素算法和KMP算法。
4.数值算法和运算:-求和、平均值、最大/最小值:循环遍历列表,累加求和,计算平均值,找出最大/最小值。
-阶乘和斐波那契数列:使用循环或递归计算给定数字的阶乘和斐波那契数列。
-幂运算和开方:通过循环或递归计算给定数字的幂和开方。
- 线性方程求解:求解形如ax + b = 0的一元线性方程。
5.图算法:-广度优先(BFS):通过遍历图的邻居节点来逐层扩展区域,通常用于查找最短路径。
-深度优先(DFS):通过遍历图的邻居节点来递归到达所有可能的节点,通常用于查找所有路径、拓扑排序等。
c语言基础算法知识C语言基础算法知识概述:C语言作为一种广泛应用的编程语言,其基础算法知识对于程序员来说至关重要。
本文将从常见的算法知识入手,介绍C语言中常用的算法及其应用。
一、排序算法排序算法是计算机科学中最基础也是最常用的算法之一。
常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序等。
这些算法的实现原理各不相同,但都能对一组数据进行排序。
1. 冒泡排序冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的元素,比较相邻的两个元素并将它们交换顺序,直至整个序列有序。
2. 选择排序选择排序是一种简单直观的排序算法,它每次从待排序的数据中选择最小(或最大)的元素,将其放到已排序序列的末尾。
3. 插入排序插入排序是一种简单直观的排序算法,它将待排序的数据分为已排序和未排序两部分,每次从未排序中取出一个元素插入到已排序的合适位置,直至整个序列有序。
4. 快速排序快速排序是一种高效的排序算法,它通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有元素都比另一部分的元素小,然后对这两部分继续进行排序,直至整个序列有序。
5. 归并排序归并排序是一种稳定的排序算法,它采用分治策略,将待排序的数据不断二分,然后对子序列进行排序,最后将排序好的子序列合并成一个有序序列。
二、查找算法查找算法是在一组数据中寻找指定元素的算法。
常见的查找算法有线性查找、二分查找、哈希查找等。
1. 线性查找线性查找是一种简单直观的查找算法,它从待查找的数据中依次比较每个元素,直到找到目标元素或遍历完整个序列。
2. 二分查找二分查找是一种高效的查找算法,它要求待查找的数据必须是有序的,通过每次将查找范围缩小一半,直到找到目标元素或查找范围为空。
3. 哈希查找哈希查找是一种快速的查找算法,它通过将关键字映射到哈希表中的位置,以实现快速定位目标元素。
三、递归算法递归算法是一种重要的算法思想,它通过函数自身的调用来解决问题。
常用算法要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。
计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。
算法数据结构是程序的两个重要方面。
算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。
指令正确地描述了要完成的任务和它们被执行的顺序。
计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解。
通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。
其次是算法所需要的存储空间少和执行更快等。
算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。
另外,为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用递归描述算法。
一、迭代法迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。
设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:(1)选一个方程的近似根,赋给变量x0;(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;(3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。
若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。
上述算法用C程序的形式表示为:【算法】迭代法求方程的根{ x0=初始近似根;do {x1=x0;x0=g(x1);/*按特定的方程计算新的近似根*/} while ( fabs(x0-x1)>Epsilon);printf(“方程的近似根是%f\n”,x0);}迭代算法也常用于求方程组的根,令X=(x0,x1,…,xn-1)设方程组为:xi=gi(X) (I=0,1,…,n-1)则求方程组根的迭代算法可描述如下:【算法】迭代法求方程组的根{ for (i=0;i<n;i++)x[i]=初始近似根;do {for (i=0;i<n;i++)y[i]=x[i];for (i=0;i<n;i++)x[i]=gi(X);for (delta=0.0,i=0;i<n;i++)if (fabs(y[i]-x[i])>delta) delta=fabs(y[i]-x[i]);} while (delta>Epsilon);for (i=0;i<n;i++)printf(“变量x[%d]的近似根是%f”,I,x[i]);printf(“\n”);}具体使用迭代法求根时应注意以下两种可能发生的情况:(1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;(2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。
二、穷举搜索法穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从众找出那些符合要求的候选解作为问题的解。
【问题】将A、B、C、D、E、F这六个变量排成如图所示的三角形,这六个变量分别取[1,6]上的整数,且均不相同。
求使三角形三条边上的变量之和相等的全部解。
如图就是一个解。
程序引入变量a、b、c、d、e、f,并让它们分别顺序取1至6的证书,在它们互不相同的条件下,测试由它们排成的如图所示的三角形三条边上的变量之和是否相等,如相等即为一种满足要求的排列,把它们输出。
当这些变量取尽所有的组合后,程序就可得到全部可能的解。
细节见下面的程序。
【程序1】# include <stdio.h>void main(){ int a,b,c,d,e,f;for (a=1;a<=6;a++)for (b=1;b<=6;b++) {if (b==a) continue;for (c=1;c<=6;c++) {if (c==a)||(c==b) continue;for (d=1;d<=6;d++) {if (d==a)||(d==b)||(d==c) continue;for (e=1;e<=6;e++) {if (e==a)||(e==b)||(e==c)||(e==d) continue;f=21-(a+b+c+d+e);if ((a+b+c==c+d+e))&&(a+b+c==e+f+a)) {printf(“%6d,a);printf(“%4d%4d”,b,f);printf(“%2d%4d%4d”,c,d,e);scanf(“%*c”);}}}}}}按穷举法编写的程序通常不能适应变化的情况。
如问题改成有9个变量排成三角形,每条边有4个变量的情况,程序的循环重数就要相应改变。
对一组数穷尽所有排列,还有更直接的方法。
将一个排列看作一个长整数,则所有排列对应着一组整数。
将这组整数按从小到大的顺序排列排成一个整数,从对应最小的整数开始。
按数列的递增顺序逐一列举每个排列对应的每个整数,这能更有效地完成排列的穷举。
从一个排列找出对应数列的下一个排列可在当前排列的基础上作部分调整来实现。
倘若当前排列为1,2,4,6,5,3,并令其对应的长整数为124653。
要寻找比长整数124653更大的排列,可从该排列的最后一个数字顺序向前逐位考察,当发现排列中的某个数字比它前一个数字大时,如本例中的6比它的前一位数字4大,这说明还有对应更大整数的排列。
但为了顺序从小到大列举出所有的排列,不能立即调整得太大,如本例中将数字6与数字4交换得到的排列126453就不是排列124653的下一个排列。
为了得到排列124653的下一个排列,应从已经考察过的那部分数字中选出比数字大,但又是它们中最小的那一个数字,比如数字5,与数字4交换。
该数字也是从后向前考察过程中第一个比4大的数字。
5与4交换后,得到排列125643。
在前面数字1,2,5固定的情况下,还应选择对应最小整数的那个排列,为此还需将后面那部分数字的排列顺序颠倒,如将数字6,4,3的排列顺序颠倒,得到排列1,2,5,3,4,6,这才是排列1,2,4,6,5,3的下一个排列。
按以上想法编写的程序如下。
【程序2】# include <stdio.h># define SIDE_N 3# define LENGTH 3# define VARIABLES 6int A,B,C,D,E,F;int *pt[]={&A,&B,&C,&D,&E,&F};int *side[SIDE_N][LENGTH]={&A,&B,&C,&C,&D,&E,&E,&F,&A};int side_total[SIDE_N];main{}{ int i,j,t,equal;for (j=0;j<V ARIABLES;j++)*pt[j]=j+1;while(1){ for (i=0;i<SIDE_N;i++){ for (t=j=0;j<LENGTH;j++)t+=*side[i][j];side_total[i]=t;}for (equal=1,i=0;equal&&i<SIDE_N-1;i++)if (side_total[i]!=side_total[i+1] equal=0;if (equal){ for (i=1;i<V ARIABLES;i++)pri ntf(“%4d”,*pt[i]);printf(“\n”);scanf(“%*c”);}for (j=V ARIABLES-1;j>0;j--)if (*pt[j]>*pt[j-1]) break;if (j==0) break;for (i=V ARIABLES-1;i>=j;i--)if (*pt[i]>*pt[i-1]) break;t=*pt[j-1];* pt[j-1] =* pt[i]; *pt[i]=t;for (i=V ARIABLES-1;i>j;i--,j++){ t=*pt[j]; *pt[j] =* pt[i]; *pt[i]=t; })}从上述问题解决的方法中,最重要的因素就是确定某种方法来确定所有的候选解。
下面再用一个示例来加以说明。
【问题】背包问题问题描述:有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。
设n个物品的重量和价值分别存储于数组w[ ]和v[ ]中,限制重量为tw。
考虑一个n 元组(x0,x1,…,xn-1),其中xi=0 表示第i个物品没有选取,而xi=1则表示第i个物品被选取。
显然这个n元组等价于一个选择方案。
用枚举法解决背包问题,需要枚举所有的选取方案,而根据上述方法,我们只要枚举所有的n元组,就可以得到问题的解。
显然,每个分量取值为0或1的n元组的个数共为2n个。
而每个n元组其实对应了一个长度为n的二进制数,且这些二进制数的取值范围为0~2n-1。
因此,如果把0~2n-1分别转化为相应的二进制数,则可以得到我们所需要的2n个n元组。
【算法】maxv=0;for (i=0;i<2n;i++){ B[0..n-1]=0;把i转化为二进制数,存储于数组B中;temp_w=0;temp_v=0;for (j=0;j<n;j++){ if (B[j]==1){ temp_w=temp_w+w[j];temp_v=temp_v+v[j];}if ((temp_w<=tw)&&(temp_v>maxv)){ maxv=temp_v;保存该B数组;}}}三、递推法递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。
设要求问题规模为N的解,当N=1时,解或为已知,或能非常方便地得到解。
能采用递推法构造算法的问题有重要的递推性质,即当得到问题规模为i-1的解后,由问题的递推性质,能从已求得的规模为1,2,…,i-1的一系列解,构造出问题规模为I的解。
这样,程序可从i=0或i=1出发,重复地,由已知至i-1规模的解,通过递推,获得规模为i的解,直至得到规模为N 的解。
【问题】阶乘计算问题描述:编写程序,对给定的n(n≦100),计算并输出k的阶乘k!(k=1,2,…,n)的全部有效数字。