算法设计题集(初学)

合集下载

算法练习题及答案

算法练习题及答案

算法练习题及答案算法练习题及答案随着计算机科学的发展,算法成为了计算机科学的核心内容之一。

算法是一种解决问题的方法和步骤,它可以将复杂的问题简化为一系列简单的操作。

为了提高算法设计和分析的能力,许多学生和程序员经常进行算法练习。

在这篇文章中,我将给出一些常见的算法练习题及其答案,希望能对读者有所帮助。

1. 反转字符串题目:给定一个字符串,将其反转并返回。

解答:可以使用两个指针,一个指向字符串的开头,一个指向字符串的末尾。

然后交换两个指针指向的字符,然后分别向中间靠拢,直到两个指针相遇。

2. 判断回文数题目:给定一个整数,判断它是否是回文数。

回文数是指正序和倒序读都一样的整数。

解答:可以将整数转换为字符串,然后使用反转字符串的方法判断是否相等。

另一种方法是将整数反转后与原来的整数进行比较。

3. 寻找两个有序数组的中位数题目:给定两个有序数组,找出这两个数组合并后的中位数。

要求时间复杂度为O(log(m+n))。

解答:可以使用二分查找的思想。

首先将两个数组合并成一个有序数组,然后找到中位数的位置。

如果数组长度为奇数,中位数就是中间的元素;如果数组长度为偶数,中位数就是中间两个元素的平均值。

4. 搜索旋转排序数组题目:给定一个按照升序排列的整数数组,经过旋转后的数组,搜索一个给定的目标值。

如果目标值存在于数组中,则返回它的索引,否则返回-1。

解答:可以使用二分查找的思想。

首先找到数组的中间元素,然后判断中间元素与目标值的关系。

如果中间元素等于目标值,直接返回索引;如果中间元素小于目标值,说明目标值在右半部分,继续在右半部分进行二分查找;如果中间元素大于目标值,说明目标值在左半部分,继续在左半部分进行二分查找。

5. 最长公共前缀题目:给定一个字符串数组,找到这些字符串的最长公共前缀。

解答:可以将第一个字符串作为初始的最长公共前缀,然后逐个比较后面的字符串与最长公共前缀的相同部分。

如果相同部分为空,则返回空;如果相同部分不为空,则更新最长公共前缀。

算法初步练习题(附详细答案)

算法初步练习题(附详细答案)

算法初步练习题一、选择题:1.阅读下面的程序框图,则输出的S =A .14B .20C .30D .552.阅读图2所示的程序框图,运行相应的程序,输出的结果是A .1 B. 2 C. 3 D. 43.阅读右图所示的程序框图,运行相应的程序,输出的结果是A .2B .4C .8D .164.某程序框图如图所示,该程序运行后输出的k 的值是A .4B .5C .6D .75.执行右面的程序框图,输出的S 是3题 2题1题4题A .378-B .378C .418-D .4186.如图的程序框图表示的算法的功能是A .计算小于100的奇数的连乘积B .计算从1开始的连续奇数的连乘积C .从1开始的连续奇数的连乘积,当乘积大于100时,计算奇数的个数D .计算100531≥⨯⋅⋅⋅⨯⨯⨯n 时的最小的n 值.7.右图是把二进制数)2(11111化为十进制数的一个程序框图,判断框内应填入的 条件是 A .4i > B .4i ≤ C .5i > D .5i ≤8.某程序框图如图所示,则该程序运行后输出的B 等于 A .15 B .29 C .31 D .635题6题9.如果执行右边的程序框图,输入2,0.5x h =-=,那么输出的各个数的和等于 A .3 B .3.5 C .4 D .4.510.某店一个月的收入和支出总共记录了N 个数据1a ,2,,N a a ⋅⋅⋅,其中 收入记为 正数,支出记为负数。

该店用右边的程序框图计算月总收入S 和月 净盈利V ,那么在图中空白的判断框和处理框中,应分别填入下列四个选项中 的A .0,A V S T >=-B .0,A V S T <=-C .0,A V S T >=+D .0,A V S T <=+ 11. 如图1所示,是关于闰年的流程,则 以下年份是闰年的为A .1996年B .1998年C .2010年D .2100年12. 某流程如右上图所示,现输入如下四个函数,则可以输出的函数是否y x =是 否开始 0x <0y =x x h +=是结束1x <输入,x h否是1y =输出y2x ≥是开始1,0,0k S T ===i A a =输出,S V 1k k =+否 结束输入12,,,,N N a a a ⋅⋅⋅ T T A =+S S A =+ N k <是否10题11题9题A .2)(x x f =B .xx f 1)(=C .62ln )(-+=x x x fD .x x f sin )(=二、填空题:13.程序框图(即算法流程图)如图所示,其输出结果是_______. 14.执行右边的程序框图,输出的T = .15.下面的程序框图表示的算法的结果是 1612题13题16.阅读右上面的流程图,若输入6,1a b ==,则输出的结果是 217右面的程序框图,如果输入三个实数a ,b ,c ,要求输出这三个数中最大的数,那么在空白的判断框中,应该填入下面四个选项中的 ①c x > ②x c > ③C .c b > ④b c >三、解答题:15题18.已知数列{a n }的各项均为正数,观察程序框图,若10,5==k k 时,分别有2110115==S S 和 (1)试求数列{a n }的通项; (2)令m a n b b b b n +++=...,221求的值.参考答案1.C .【解读与点评】当1=i 时, S =1;当i =2时, S =5;循环下去,当i =3时, S =14; 当i =4时,S =30;本试题考查了程序框图的运用.2.D 【解读与点评】本题考查是算法的重新框图与算法的语句识别.易错点是 不懂得运行顺序.当1,2n S ==代入程序中运行第一次是1S =-,然后赋值此时2n =;返回运 行第二次可得111(1)2S ==--,然后赋值3n =; 再返回运行第三次可得12112S ==-,然后赋值4n =,判断可知此时2S =,故输出4n =.故选D .3.C 【解读与点评】本题考查是算法的重新框图与算法的语句识别.考查学生 运算求解能力.本题的易错点是要注意是先赋值再输出.当1,2n S ==代入程序中运行第一次是1S =-,然后赋值此时2n =;返回运 行第二次可得111(1)2S ==--,然后赋值4n =; 再返回运行第三次可得12112S ==-,然后赋值8n =,判断可知此时2S =,故输出8n =. 4.A .【解读与点评】对于0,1,k s ==1k ∴=.对于1,3,2k s k ==∴=,则2,38,3k s k ==+∴=,后面是113,382,4k s k ==++∴=,不符合条件时输出 的4k =.此题是新课程新增内容,考查了程序语言的概念和基本的应用,通 过对程序语言的考查,充分体现了数学程序语言中循环语言的关键. 9.B .【解读与点评】循环9次,对应输出值如下表。

算法与程序设计试题带答案

算法与程序设计试题带答案

算法与程序设计试题带答案1. 以下是一道经典的算法题,请编写代码实现求最大公约数(GCD)的算法。

```pythondef gcd(a, b):if b == 0:return areturn gcd(b, a % b)# 测试print(gcd(15, 25)) # 输出 5print(gcd(54, 72)) # 输出 18```解析:这是一个使用递归实现的辗转相除法算法,也叫欧几里得算法。

当两个数 a 和 b 求最大公约数时,如果 b 等于 0,则 a 就是最大公约数;否则,将 b 作为新的 a,将 a 除以 b 的余数作为新的 b 进行递归计算。

2. 请编写代码实现一个链表的反转。

```pythonclass ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef reverse_linked_list(head):prev = Nonecurr = headwhile curr:next_node = curr.nextcurr.next = prevprev = currcurr = next_nodereturn prev# 测试node1 = ListNode(1)node2 = ListNode(2)node3 = ListNode(3)node1.next = node2node2.next = node3reversed_head = reverse_linked_list(node1)while reversed_head:print(reversed_head.val)reversed_head = reversed_head.next```解析:这是一个经典的链表反转算法。

使用 prev、curr、next_node 三个指针来实现,其中 prev 用于保存上一个节点,curr 用于保存当前节点,next_node 用于保存下一个节点。

算法设计练习题

算法设计练习题

算法设计练习题1、设一棵二叉树以二叉链表为存储结构,结点结构为。

设计一个算法,求在前根序列中处于第k个位置的结点。

2、设某单链表L的结点结构为编写算法判断该链表的元素是否是递增的。

3、设有一单链表L,结点结构为3个,试画出链表L的结构图,并编写算法判断该单链表L中的元素是否成等差关系,即:设各元素值次为a1,a2,a3,…,a n,判断a i+1-a i=a i-a i-1是否成立,其中i满足2<=i<=n-1.4、设有一棵二叉树以二叉链表作为存储结构,结点结构为其中data数字的字符(即‘0’<=data<=‘9’)5、写出一个在带头结点的单链表上删除表中第i个结点的算法。

单链表的结点类型及单链表类型定义:typedef struct node{ DataType data;struct node *next;}Node, *LinkList;6、给出求二叉树的结点数的算法。

二叉树的二叉链表存储表示:typedef struct BiTNode{ DataType data;struct BiTNode *lchild,*rchild;}BiTNode, *BiTree;7. 写出一个删除单链表的表头结点和表尾结点的算法。

单链表的结点类型及单链表类型定义:typedef struct node{ DataType data;struct node *next;}Node, *LinkList;8、已知一带头结点的单链表,由头指针H指向,其结点的类型如下:typedef struct node{ elemtype data;struct node *next;}NODE,*NODEPTR;现要在链表中删除其关键字为aidkey的结点,其程序如下:int deletelm(NODEPTR H,keytype aidkey)/*若删除成功,则返回1,否则返回0*/{ NODEPTR pre,p;pre=H;p=H->next;while(p&&p->data.key!=aidkey){ pre=p;①;}if(p){ ②;free(p);return 1;}else return 0;}9、已知待排序的线性表的结构定义如下:#define MAXSIZE 200typedef int keytype;typedef struct{ keytype key;othertype other;}redtype;typedef struct{ redtype r[MAXSIZE];int length;}sqlist;其中L->r[0]用于作临时单元,数据从L->r[1]开始存放。

算法入门习题108道

算法入门习题108道

算法⼊门习题108道本题库来源:⼤榕树论坛/doc/76b6538d6529647d272852c1.html ⼊门习题⼀百道。

字符串处理1.读⼊N个字母的字,判断该字是否回⽂。

2.有N组数据,每组中有M个字串,找出所有符合下列条件的字串S,条件是:在每⼀组中,字串S都是其M个字串之⼀。

3.读⼊⼀个字串(长度不⼤于50),删去字串中相同的字符。

4.输⼊⼗个字符串,长度在20….50之间。

检查每个字串,若遇到字母A,就在其后插⼀个空格,最后打印全部处理后的字串,并统计26个字母各出现多少次。

5.接受⼀个任意长度的字串(⼩于100个字符),将该字符串中的字符按照ASCII码表从⼩到⼤的顺序重新排列成⼀个新的字符串并打印出来。

6.有⼀段⽂字由若⼲字母组成。

检查⽂字中每个字母出现的次数,输出时,按字母出现频率的降序排序,并按以下格式打印(不含未出现字母):字母频率百分⽐%x x x7.读⼊⼀⾏⽂本,包含若⼲个单词(以空格间隔,以%j结尾)。

将其中以A开头的单词与以N结尾的单词,⽤头尾交换的⽅法予以置换。

8.求出⼀个⼦串在字符串中的位置。

9.在若⼲个字符串中,找出⼀个长度最长的公共字串。

10.’DOS’称为良序⼦串,因为他之中的字母是按ASCII码的顺序排列的,⽽’DATA’则不是良序字符。

先要求给出⼀个N*N的字母⽅阵,从中选出给定长度M的良序字符。

11.从键盘上读⼊⼀个字符串(称为原串),其长度不超过50个字符,并以字符’$’作为结束符。

当原串读⼊后,对原串进⾏编辑,其功能有(菜单选择):①在原串中制定的字符前⾯插⼊若⼲个字符(字串)。

若在原串中有若⼲个指定的字符,则插⼊在第⼀个指定字符的前⾯。

例:原串‘abcd dby’在指定字符‘b’的前⾯插⼊‘umv’,此时字符串成为‘auwvbc dby’②在原串中,删除指定的⼦串,若原串中有多个相同的⼦串,则删除最后⼀个⼦串。

例:原串‘abxyzw cdxyzh,uvxxyzh’删除⼦串’xyz’后得到:‘abxyzw cdxyzh,uvxh’③替换操作:在原串中,将某个⼦串⽤新的⼦串去替换。

算法练习题

算法练习题

算法练习题一、基础算法1. 编写一个程序,实现一个冒泡排序算法。

2. 实现一个选择排序算法。

3. 实现一个插入排序算法。

4. 编写一个函数,计算一个整数数组中的最大值和最小值。

5. 编写一个函数,实现二分查找算法。

6. 编写一个函数,实现快速排序算法。

7. 编写一个函数,判断一个整数是否为素数。

8. 编写一个函数,实现反转一个整数数组。

9. 编写一个函数,计算两个整数数组的交集。

10. 编写一个函数,判断一个字符串是否为回文。

二、数据结构11. 实现一个单链表的基本操作,包括插入、删除、查找。

12. 实现一个双向链表的基本操作,包括插入、删除、查找。

13. 实现一个栈的基本操作,包括压栈、出栈、查看栈顶元素。

14. 实现一个队列的基本操作,包括入队、出队、查看队首元素。

15. 实现一个二叉树的基本操作,包括插入、删除、查找。

16. 实现一个二叉搜索树的基本操作,包括插入、删除、查找。

17. 实现一个哈希表的基本操作,包括插入、删除、查找。

三、搜索与图论18. 编写一个程序,实现深度优先搜索(DFS)算法。

19. 编写一个程序,实现广度优先搜索(BFS)算法。

20. 编写一个程序,求解迷宫问题。

21. 编写一个程序,计算一个有向图的拓扑排序。

22. 编写一个程序,计算一个无向图的欧拉回路。

23. 编写一个程序,计算一个加权无向图的最小树(Prim算法)。

24. 编写一个程序,计算一个加权有向图的最短路径(Dijkstra算法)。

25. 编写一个程序,计算一个加权有向图的所有顶点对的最短路径(Floyd算法)。

四、动态规划26. 编写一个程序,实现背包问题。

27. 编写一个程序,计算最长公共子序列(LCS)。

28. 编写一个程序,计算最长递增子序列(LIS)。

29. 编写一个程序,实现编辑距离(Levenshtein距离)。

30. 编写一个程序,实现硬币找零问题。

31. 编写一个程序,实现矩阵链乘问题。

软件大赛算法设计练习题目

1、母牛生小牛Problem设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛?Input本题有多组数据。

每组数据只有一个整数N,独占一行。

(1≤N≤50)Output对每组数据,输出一个整数(独占一行)表示第N年时母牛的数量Sample Input14520Sample Output1238722、座位调整题目描述:百度办公区里到处摆放着各种各样的零食。

百度人力资源部的调研发现,员工如果可以在自己喜欢的美食旁边工作,工作效率会大大提高。

因此,百度决定进行一次员工座位的大调整。

调整的方法如下:1 .首先将办公区按照各种零食的摆放分成N 个不同的区域。

(例如:可乐区,饼干区,牛奶区等等)。

2 .每个员工对不同的零食区域有不同的喜好程度(喜好程度度的范围为1 — 100 的整数,喜好程度越大表示该员工越希望被调整到相应的零食区域)。

3 .由于每个零食区域可以容纳的员工数量有限,人力资源部希望找到一个最优的调整方案令到总的喜好程度最大。

数据输入:第一行包含两个整数N ,M ,(1<=N ,M<=300 )。

分别表示N 个区域和M 个员工。

第二行是N 个整数构成的数列a ,其中a[i] 表示第i 个区域可以容纳的员工数,(1<=a[i]<=M ,a[1]+a[2]+..+a[N]=M) 。

紧接着是一个M*N 的矩阵P ,P (i ,j )表示第i 个员工对第j 个区域的喜好度。

答案输出:对于每个测试数据,输出可以达到的最大的喜好程度。

输入样例3 31 1 1100 50 25100 50 25100 50 25输出样例175数据解释:此数据只存在一种安排方法,三个员工分别安置在三个区域。

最终的喜好程度为100+50+25=175最优解3、剪刀石头布剪刀石头布N 个小孩正在和你玩一种剪刀石头布游戏。

N 个小孩中有一个是裁判,其余小孩分成三组(不排除某些组没有任何成员的可能性),但是你不知道谁是裁判,也不知道小孩们的分组情况。

算法分析与设计试题及答案

算法分析与设计试题及答案一、选择题1. 下列哪个是属于分治算法的例子?A. 冒泡排序B. 归并排序C. 顺序查找D. 选择排序答案:B2. 在排序算法中,时间复杂度最优的是:A. 冒泡排序B. 插入排序C. 归并排序D. 快速排序答案:C3. 哪个不是动态规划的特点?A. 具有重叠子问题B. 通过递归求解C. 需要保存子问题的解D. 具有最优子结构答案:B4. 在图的广度优先搜索算法中,使用的数据结构是:A. 栈B. 队列C. 数组D. 堆栈答案:B5. 在最小生成树算法中,下列哪个不属于贪心策略?A. Kruskal算法B. Prim算法C. Dijkstra算法D. Prim-Kruskal混合算法答案:C二、简答题1. 请简述分治算法的思想和应用场景。

答案:分治算法的思想是将原问题分解成若干个规模较小且类似的子问题,然后解决子问题,最后将子问题的解合并得到原问题的解。

其应用场景包括排序算法(如归并排序、快速排序)、搜索算法(如二分查找)等。

2. 什么是动态规划算法?请给出一个动态规划算法的示例。

答案:动态规划算法是一种通过将问题分解成子问题并解决子问题来解决复杂问题的方法。

它的特点是具有重叠子问题和最优子结构性质。

以斐波那契数列为例,可以使用动态规划算法求解每一项的值,而不需要重复计算。

3. 图的深度优先搜索和广度优先搜索有什么区别?答案:图的深度优先搜索(Depth First Search,DFS)是一种先访问子节点再访问兄弟节点的遍历算法,通常使用递归或者栈实现。

而广度优先搜索(Breadth First Search,BFS)则是以层次遍历的方式展开搜索,使用队列来实现。

DFS更适合用于搜索路径,BFS则适用于寻找最短路径等。

4. 请简述贪心算法的特点及其应用场景。

答案:贪心算法的特点是每一步都采取当前状态下最优的选择,以期望得到全局最优解。

然而,贪心算法并不一定能求解所有问题的最优解,但对于一些特定问题,贪心算法往往能得到近似最优解。

初级编程算法设计方法15种典型例题

初级编程算法设计方法15种典型例题本文档介绍了初级编程算法设计的15种典型例题,以帮助读者提高编程技能和解决问题的能力。

1. 逆序输出题目要求:输入一个整数n,逆序输出其各个位上的数字。

示例:输入:1234输出:43212. 求和题目要求:输入一个整数n,计算从1到n的所有整数的和。

示例:输入:5输出:153. 阶乘计算题目要求:输入一个整数n,计算n的阶乘。

示例:输入:4输出:244. 素数判断题目要求:输入一个正整数n,判断n是否为素数。

示例:输入:7输出:是素数5. 最大公约数题目要求:输入两个正整数a和b,计算它们的最大公约数。

示例:输入:12, 18输出:66. 最小公倍数题目要求:输入两个正整数a和b,计算它们的最小公倍数。

示例:输入:4, 6输出:127. 数字反转题目要求:输入一个整数n,将其各个位上的数字反转。

示例:输入:输出:8. 数字平方根题目要求:输入一个正整数n,计算它的平方根。

示例:输入:9输出:39. 日期格式化题目要求:输入一个日期字符串,将其格式化为YYYY-MM-DD的格式。

示例:输入:""输出:"2022-11-30"10. 列表合并题目要求:输入两个已排序的列表a和b,将它们合并成一个有序的列表。

示例:输入:[1, 3, 5], [2, 4, 6]输出:[1, 2, 3, 4, 5, 6]11. 找出重复元素题目要求:输入一个列表,找出其中重复的元素。

示例:输入:[1, 2, 3, 2, 4, 5, 3]输出:[2, 3]12. 字符串反转题目要求:输入一个字符串,将其反转。

示例:输入:"Hello"输出:"olleH"13. 矩阵转置题目要求:输入一个m ×n的矩阵,将其转置为n ×m的矩阵。

示例:输入:[[1, 2, 3], [4, 5, 6]]输出:[[1, 4], [2, 5], [3, 6]]14. 链表反转题目要求:输入一个链表,将其反转。

算法设计题目

第2章1、大整数乘法的O(nm log(3/2))算法给定2个大整数u和v,它们分别有m位和n位数字,且mn。

用通常的乘法求uv的值需要O(mn)时间。

可以u和v均看作是有n位数字的大整数,用教材第2章介绍的分治法,在O(n log3)时间内计算uv的值。

当m比n小得多时,用这种方法就显得效率不够高。

试设计一个算法,在上述情况下用O(nm log(3/2))时间求出uv的值。

2、O(1)空间子数组换位算法设a[0:n-1]是一个有n个元素的数组,k(1kn-1)是一个非负整数。

试设计一个算法将子数组a[0:k-1]与a[k+1:n-1]换位。

要求算法在最坏情况下耗时O(n),且只用到O(1)的辅助空间。

3、段合并排序算法如果在合并排序算法的分割步骤中,将数组a[0:n-1]划分为个子数组,每个子数组中有O()个元素。

然后递归地对分割后的子数组进行排序,最后将所得到的个排好序的子数组合并成所要的排好序的数组a[0:n-1]。

设计一个实现上述策略的合并排序算法,并分析算法的计算复杂性。

4、合并排序算法对拨给元素存储于数组和存储于链表中的2种情形,写出合并排序算法。

5、非增序快速排序算法如何修改QuickSort才能使其将输入元素按非增序排序?第三章1、整数线性规划问题考虑下面的整数线性规划问题试设计一个解此问题的动态规划算法,并分析算法的计算复杂性。

2、Ackermann函数Ackermann函数A(m,n)可递归地定义如下:A(m,n)=试设计一个计算A(m,n)的动态规划算法,该算法只占用O(m)空间。

3、独立任务最优调试问题问题描述:用2台机A和B处理n个作业。

设第i个作业交给机器A 处理时需要时间a i,若由机器B来处理,则需要时间b i。

由于各作业的选战和机器的性能关系,很可能对于某些i,有ai≥bi,而对于某些j,j≠i,有a i<b j。

既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计题集第一章算法初步第一节程序设计与算法一、算法算法是解决问题方法的精确描述,但是并不是所有问题都有算法,有些问题经研究可行,则相应有算法,但这并不是说问题就有结果。

上述的“可行”,是指对算法的研究。

1.待解问题的描述待解问题表述应精确、简练、清楚,使用形式化模型刻划问题是最恰当的。

例如,使用数学模型刻划问题是最简明、严格的,一旦问题形式化了,就可依据相应严格的模型对问题求解。

2.算法设计算法设计的任务是对各类具体问题设计良好的算法及研究设计算法的规律和方法。

常用的算法有:穷举搜索法、递归法、回溯法、贪心法、分治法等。

3.算法分析算法分析的任务是对设计出的每一个具体的算法,利用数学工具,讨论各种复杂度,以探讨某种具体算法适用于哪类问题,或某类问题宜采用哪种算法。

算法的复杂度分时间复杂度和空间复杂度。

.时间复杂度:在运行算法时所耗费的时间为f(n)(即 n的函数)。

.空间复杂度:实现算法所占用的空间为g(n)(也为n的函数)。

称O(f(n))和O(g(n))为该算法的复杂度。

二、程序设计1.程序程序是对所要解决的问题的各个对象和处理规则的描述,或者说是数据结构和算法的描述,因此有人说,数据结构+算法=程序。

2.程序设计程序设计就是设计、编制和调试程序的过程。

3.结构化程序设计结构化程序设计是利用逐步求精的方法,按一套程式化的设计准则进行程序的设计。

由这种方法产生的程序是结构良好的。

所谓“结构良好”是指:(1)易于保证和验证其正确性;(2)易于阅读、易于理解和易于维护。

按照这种方法或准则设计出来的程序称为结构化的程序。

“逐步求精”是对一个复杂问题,不是一步就编成一个可执行的程序,而是分步进行。

.第一步编出的程序最为抽象;.第二步编出的程序是把第一步所编的程序(如过程、函数等)细化,较为抽象;.…….第i步编出的程序比第i-1步抽象级要低;.…….直到最后,第n步编出的程序即为可执行的程序。

所谓“抽象程序”是指程序所描述的解决问题的处理规则,是由那些“做什么”操作组成,而不涉及这些操作“怎样做”以及解决问题的对象具有什么结构,不涉及构造的每个局部细节。

这一方法原理就是:对一个问题(或任务),程序人员应立足于全局,考虑如何解决这一问题的总体关系,而不涉及每局部细节。

在确保全局的正确性之后,再分别对每一局部进行考虑,每个局部又将是一个问题或任务,因而这一方法是自顶而下的,同时也是逐步求精的。

采用逐步求精的优点是:(1)便于构造程序。

由这种方法产生的程序,其结构清晰、易读、易写、易理解、易调试、易维护;(2)适用于大任务、多人员设计,也便于软件管理。

逐步求精方法有多种具体做法,例如流程图方法、基于过程或函数的方法。

[例]求两自然数,其和是667,最小公倍数与最大公约数之比是120:1(例如(115,552) 、(232,435))。

[解]两个自然数分别为m和667-m(2≤m≤333)。

处理对象:m(自然数)、l(两数的最小公倍数)、g(两数的最大公约数)。

处理步骤:对m从2到333检查l与g的商为120,且余数为0时,打印m与667-m 。

第一层抽象程序:Program TwoNum;Var m,l,g:integer;Begin for m:=2 to 333 dobegin l:=lcm(m,667-m); {求最小公倍数}g:=gcd(m,667-m);{求最大公约数} if (l=g*120)and(l mod g=0) then writeln(m:5,667-m:5);end;End.第二层考虑函数lcm(最小公倍数)、gcd (最大公约数)的细化。

最大公约数问题是对参数a、b,找到一个数i能整除a与b,i就是gcd的函数值。

Functiongcd(a,b:integer):integer;var i:integer;begin for i:=a downto 1 do if not((a mod i=0)or(b mod i=0)) then gcd:=i;end;而最小公倍数的计算是:若干个b之和,若能被a整除,则该和便是a、b的最小公倍数。

Functionlcm(a,b:integer):integer;var i:integer;begin i:=b;while i mod a<>0 do i:=i+b; lcm:=i;end;第二节 编程入门题例编程入门题(一)1、位数对调:输入一个三位自然数,把这个数的百位与个位数对调,输出对调后的数。

例如:Input 3 bit natrue data:234 n=432[解]1.先确定输入数n 是否三位数,即n>99且n<=999。

2.位数对调:n=abc →cba=x ①百位数a=n 整除100;②十位数b=(n-a*100)整除10;③个位数c=n 除以10的余数;3.得对调后的数:x=c*100+b*10+a [程序] {$I-} {输入的数据为整数} program Threebit;var x,n,a,b,c:INTEGER;BEGIN write('Input 3 bit nature data:'); readln(n); IF (n>99) and (n<1000) then begin a:=n DIV 100; {求百位数} b:=(n-a*100) DIV 10;{求十位数} c:=n mod 10; {求个位数} x:=c*100+b*10+a; {得新数X}writeln('Number=',x:3); endELSE writeln('Input error!');END.2、求三角形面积:给出三角形的三个边长为a ,b ,c ,求三角形的面积。

提示:根据海伦公式来计算三角形的面积: S =2cb a ++;Area =))()((c S b S a S S --- [解]1.输入的三角形三边长a,b,c 要满足“任意两边长的和大于第三边长”。

2.按海伦公式计算:s=(a+b+c )/2;x=s*(s-a)*(s-b)*(s-c) 这时若x>=0,则求面积:area=x ,并输出area 的值。

[程序]PROGRAM hl;VAR a,b,c,s,x,area:real; BEGINwrite('Input a,b,c:');readln(a,b,c);If (a>0) and (b>0) and (c>0) and (a+b>c)and(a+c>b)and(b+c>a) Then Begin s:=(a+b+c)/2; x:=s*(s-a)*(s-b)*(s-c);If x>=0 Then Begin Area:=SQRT(x);writeln('Area=',area:8:5); End; EndElse writeln('Input error!') END.3、模拟计算器:试编写一个根据用户键入的两个操作数和一个运算符,由计算机输出运算结果的程序。

这里只考虑加(+)、减(-)、乘(*)、除(/)四种运算。

例1:Input x,y :15 3Input operator(+,-,*,/):+ 15.00+ 3.00= 18.00例2:Input x,y:5 0Input operator(+,-,*,/):/divide is zero![解]该题关键是判断输入的两数是作何种运算(由输入的运算符operator决定,如'+'、'-'、'*'、'/'分别表示加、减、乘、除法的运算)。

其中要进行除(/)运算时,要先进行合法性检查,即除数不能为0。

[程序]PROGRAM Oper;Var x,y,n:real;operator:char;Beginwrite('Input x,y:');readln(x,y);write('Input operator:');readln(operator);Case operator of'+':n:=x+y; {加法运算}'-':n:=x-y; {减法运算}'*':n:=x*y; {乘法运算}'/':If y=0 then {除法运算}begin writeln('Divide is zero!');halt;endElse n:=x/y;else begin writeln('Input operator error!');halt;end;End;writeln(x:6:2,operator,y:6:2,'=',n:6:2);End.4、念数字:编一个“念数字”的程序,它能让计算机完成以下工作:当你输入一个0至99之间的数后,计算机就会用汉字拼音印出这个数的念结束。

例1:Input data:35SAN SHI WU例2:Input data:0LING如果输入的数不在0到99之间,就印出“CUO LE”(错了),请求重新输入。

注:为了使不熟悉汉语拼音的同学也能做这个题,把“零,一,二,三,……,九,十”的拼音法写在下面。

零 LING 一 YI 二 ER 三 SAN 四 SHI 五 WU六 LIU 七 QI 八 BA 九 JIU 十 SHI[解]输入数在0~99之间,若x为两位数则拆分为十位数、个位数。

然后调用念数过程Readdigit用汉字拼音印出各位数(0~9)的念。

[程序]{$I-}Program NinShu;Var x,a,b:Integer;Procedure ReadDigit(n:Integer);{念数过程:n=0~9}BeginCase n of0:write('LING ');1:write('YI ');2:write('ER ');3:write('SAN ');4:write('SHI ');5:write('WU ');6:write('LIU ');7:write('QI ');8:write('BA ');9:write('JIU ');End;End; {ReadDigit}Begin {main}Repeat write('Input data:');readln(x);if (x<0) or (x>99) then writeln('Cuo Le');Until (x>=0)and(x<=99);If (x>=0)and(x<=9) then ReadDigit(x) {调用念数过程}Else Begin a:=x DIV 10; b:=x mod 10; {位数拆分}If a<>1 then ReadDigit(a);writeln(' Shi');if b<>0 then ReadDigit(b);End;writeln;End.5、数列找数:数组A(N)的各下标变量中N个互不相等的数,键盘输入正整数M(M≤N),要求打印数组中第M大的下标变量的值。

相关文档
最新文档