
C语言的科学和艺术(读书笔记)
文章平均质量分 82
读书笔记
Fiona-Dong
这个作者很懒,什么都没留下…
展开
-
(十七)深入学习 -- 3. 算法分析
3. 算法分析3.1 评估算法效率算法的计算复杂性字母N表示问题规模,当N值变大时,N和算法运行时间之间的关系被称为该算法的计算复杂性(computational complexity)。3.2 O标记O标记计算机科学家用–种特殊记号表示算法的计算复杂性。这个符号为O标记(读作Big Oh)。这个符号由一个大写的字母O及其后的一个用圆括号括起的公式组成,该公式表示运行时间随问题规模变化的函数。字母O代表单词order(顺序),指的是近似值。恒定时间如果一个操作所需的时间与原创 2021-07-26 18:58:15 · 565 阅读 · 0 评论 -
(十七)深入学习 -- 2. 抽象数据类型
2. 抽象数据类型按照它的行为而不是它的表示方式定义的类型叫做抽象数据类型(abstract datatype),其缩写为ADT。2.1 队列抽象在程序设计中,模拟一组人排队等候的行为方式的结构叫做队列(queue) 。基本操作包括:创建一个新的等候队列。删除一个已存在的等候队列。在等候队列末尾加入一个顾客。在程序设计中,在队尾加入一个新项的操作,叫做入队(enqueue)操作。从队首删除一个顾客。在程序设计中,删除队首项的操作叫做出队(dequeue)操作。确定一个原创 2021-07-22 20:35:43 · 268 阅读 · 1 评论 -
(十七)深入学习 -- 1. 递归
1. 递归**递归(recursion)**是指把一个很大的问题转化成同样形式但小一些的问题加以解决。1.1 递归的简单说明举一个例子,工作是筹集1000000美元的资金。完成这项任务的办法就是把部分工作交给其他人做。如果能找到10个位于全国各地的志愿者,可以委任他们为各地的区域协调人,这样他们每个人只要筹集100000美元就够了。这种代理的过程可以层层深入下去直到筹款人可以一次募集到所有他们需要的捐款。可以将上述筹资策略用伪代码来表示,它的结构如下所示:以上伪代码中,最重要的是原创 2021-07-04 10:16:48 · 433 阅读 · 6 评论 -
(十六)记录 -- 6. 基于记录的应用程序设计
6. 基于记录的应用程序设计6.1 使用数据库的重要性目标是开发一个应用程序,提供程序化教学,使不具备编程技能的老师可以提出问题、接受答案并根据前后对照的信息使程序按照适当的顺序进行。为了达到这个目标,可以将程序设计为一个通用的工具,该工具可以从文件中读入与程序化教学相关的信息和数据。只要提供不同的数据文件,同一个程序就可以支持不同的课程了。6.2 问题的框架当程序运行时,基本的操作是重复执行以下几步操作:(1) 提出当前的问题。一个问题可以由一行或多行文本组成,这些文本可以用字符串表示。原创 2021-06-27 17:27:31 · 113 阅读 · 0 评论 -
(十六)记录 -- 5. 创建记录的数据库
5. 创建记录的数据库用来存储结构化对象集合的数据结构(特别是当这些结构存储在一个数据文件中时)常被称为数据库(database)。当需要通过其他函数访问数据时,同时传递两个变量(数组本身及其有效大小)会造成很大的麻烦。如果将数组的有效大小与数据记录结合为一个单独的对象,会使操作变得简单。可以定义一个新的结构类型来完成上述工作,该类型包含了上述的两部分值。将新类型定义为指向记录的指针效率会更高。因此,整个员工数据库可以按照下面的结构定义:typedef struct { employee原创 2021-06-10 20:53:26 · 194 阅读 · 0 评论 -
(十六)记录 -- 4. 记录的指针
4. 记录的指针大多数情况下,存储结构化数据的变量通常被定义为记录的指针,而不是记录本身。指向记录的指针通常比记录小且较容易操作。更重要的是,当把记录的指针传递给某个过程时,过程可以改变记录的内容。即,传递记录的指针可以对记录中的字段进行操作。例如,employeeT的定义如下:typedef struct{ string name; string title; string ssnum; double salary; int withholding;原创 2021-06-06 16:39:52 · 807 阅读 · 0 评论 -
(十六)记录 -- 3. 数组与记录的结合
3. 数组与记录的结合现代程序设计语言的一大特点是,当拥有一个类型时,就可以利用它来创建更复杂的新类型。为了达到这一目的,通常可以定义记录数组,或者包含数组的记录。例如, 在前文定义了一个名为employeeT的类型。一旦定义了该类型,就可以用它来声明数组,而数组的元素的类型就是employeeT。代码:employeeT staff[10];就声明staff是具有10个雇员的数组。可以选取staff的任意元素,就如从其他数组中选取元素一样。例如,可以用staff[1]来选取Bob Cra原创 2021-06-06 09:22:59 · 142 阅读 · 2 评论 -
(十六)记录 -- 2. 记录在C语言中的使用
2. 记录在C语言中的使用在C语言中创建一个记录,需要执行如下两个步骤:(1) 定义一个新的结构类型。在声明变量前,必须先定义一个新的结构类型。类型定义指明了记录是由哪些字段组成,字段的名称,以及字段中信息的类型。这种结构类型为所有具有新类型的对象定义了一个模式,但并不分配任何存储空间。(2) 声明新类型的变量。数据值存入其中。2.1 定义一个结构类型在C语言中定义结构,本书采用上述句法框中的定义方式。新类型的名称在最后一行出现,之前为组成该结构的字段说明。字段由一系列的字段声明定义原创 2021-05-30 09:09:12 · 1102 阅读 · 0 评论 -
(十六)记录 -- 1. 数据记录的概念
1. 数据记录的概念将一组无序的、异质的数据看作一个整体,在C语言中,这样的一组数据被称为结构(structure),而在计算机科学这一领域内则被称为记录(record)。例如,为打印工资单,必须知道雇员的姓名、职位、社会保障号、薪水、扣缴税款的情况。这些信息组成了一个雇员的记录。员花名册包含两个记录,相关的数据如下所示:每个记录都由若干个部分组成,这些组成部分提供了关于雇员某一方面的信息。每个组成部分通常被称为字段(field)。每个字段都有相关的类型,不同的字段可以有不同的类型。虽然原创 2021-05-30 09:09:03 · 2465 阅读 · 0 评论 -
(十五)文件 -- 5. 格式化I/O
5. 格式化I/O5.1 printf的三种形式函数printf具有三种不同的形式:函数printf通常将输出直接写入标准输出。函数fprintf与printf基本相同,只是以一个FILE指针作为第一个参数,并将其输出写入该文件。而函数sprintf则以一个字符数组作为第一个参数,并将printf调用要显示的字符写入该数组。函数sprintf的调用函数应确保数组空间足够大以容纳输出数据。除输出的目的地不同外,三种形式的printf的工作方式是相同的:它们将control strin原创 2021-05-23 10:44:40 · 230 阅读 · 0 评论 -
(十五)文件 -- 4. 面向行的I/O
4. 面向行的I/O由于文件通常被划分成行,因此很有必要一次读入整行数据。stdio.h中执行这一操作的函数为fgets,其函数原型为:string fgets(char buffer[], int bufsize, FILE *infile);此函数的作用在于将下一行文件读入字符数组buffer中。通常,fgets在读入第一个换行字符后停止读取,但如果该行的长度超过了由函数参数bufsize限定的长度,则fgets函数将提前返回。因此,buffer数组中表示终止的空字符前应为一换行符,除非该原创 2021-05-23 09:52:12 · 137 阅读 · 0 评论 -
(十五)文件 -- 3. 语言中文件的使用
3.字符I/O文件处理的最简便的方法是逐字符地遍历该文件。stdio.c接口定义了getc(infile)函数,该函数从某一文件中读取下一个字符,并将其返回给调用函数。同时还定义了getchar()函数,该函数从标准输入文件中进行读取,因此与getc(stdin)作用相当。getc的的函数原型如下所示:int getc(FILE *infile);初看之下,函数返回值的类型是很奇怪的。函数原型指定getc返回一个整型值,虽然该函数在概念上返回的是一个字符。这样设计的原因是因为返回一个字符会原创 2021-05-16 18:10:05 · 302 阅读 · 0 评论 -
(十五)文件 -- 2. 语言中文件的使用
2. 语言中文件的使用在ANSIC中,基本的文件操作是标准I/O库接口stdio.h的一部分。标准I/O库的真正强大之处在于它允许你以可移植的方式指定文件操作,这种方式是方便、有效的。在C程序中使用文件,需要完成以下工作:(1) 声明一个FILE*类型的变量。(2) 通过调用fopen函数将此变量和某实际文件相联系。这一操作称为打开(open)文件。打开一个文件要求指定文件名,并且指明该文件是用于输入还是输出。(3) 调用stdio.h中适当的函数完成必要的I/O操作。对输入文件来说,这些函数原创 2021-05-15 16:20:14 · 179 阅读 · 2 评论 -
(十五)文件 -- 1. 文本文件
1. 文本文件当用文件存储程序中要用到的数据时,这个文件通常都会包含文本,所以称之为文本文件(textfile)。可以将文本文件看作存储在永久介质上的字符序列,并通过文件名来标识这些文件。文本文件和字符串在很多方面有相似之处。文本文件和字符串一样,是由有序的字符集合组成的。而且,它们都有确定的结束点。在字符串中,数据结束是用空字符表示的;文本文件的结尾用一种特殊的文件结束标志,说明该标志之后再没有字符出现了。例如,字符’\n’表示文件结束。当从某一文件中读取字符时,必须检测这个文件结束标志,原创 2021-05-15 15:01:19 · 1249 阅读 · 0 评论 -
(十四)再论字符串 -- 3. strib库的实现
3. strib库的实现正如本章前文所述,strlib.h的主要目的是对客户隐藏有关内存分配的复杂性。使用该库时,客户不必考虑分配固定大小的字符数组,也不必担心字符数组是否超出了内存空间的界限。所有的字符串都表示为指针,它指向从堆中通过动态分配所获得的字符内存空间。3.1 实现转换函数在stlib.h的所有函数中, 实现起来最简单的就是那些和string.h里的函数一样的函数,如StringLength和StringCompare。在这种情况下,通常的做法是让一个接口重新命名比它更低层的接口原创 2021-05-14 19:14:35 · 364 阅读 · 2 评论 -
(十四)再论字符串 -- 2. ANSI字符串库
2. ANSI字符串库到目前为止,对字符串的使用仅限于strlib.h中定义的操作。商业性的C语言程序,使用定义成ANSI标准一部分的string.h接口。在 第9章,已经讨论过strlib.h接口和string.h接口的关系,同时也介绍了分层抽象的概念。string.h输出的常用函数,如下图所示:两个字符串库的最大区别在于:怎样为字符串中的字符分配内存空间。在strlib.h接口中,函数本身就会分配必要的内存空间,使得strlib.h接口更容易使用。在string.h接口中,当一个新原创 2021-03-21 18:22:46 · 355 阅读 · 2 评论 -
(十四)再论字符串 -- 1. string类型的概念表示
1. string类型的概念表示1.1 字符串作为数组在计算机内部,字符串被表示为字符数组。只要将一个字符串存储到内存,这个字符串中的字符就都被分配到连续的字节中。但是,存放字符本身并不足以表示所有与字符串有关的重要信息。操作字符串值的程序必须具有某种确定字符串结束的方法。为了解决这一问题,C语言编译器总是在字符串最后一个字符后面的字节里存放一个空字符,写为 \0, 该字符常量的ASCII码为0,表示字符串结束的标记。因此,如果字符串常量"Hello"和"there"出现在一个程序中,C语言编译器原创 2021-03-07 21:35:31 · 314 阅读 · 0 评论 -
(十三)指针 -- 5. 动态分配
5. 动态分配静态分配(staticallocation)当声明一个全局变量时,编译器给在整个程序中持续使用的变量分配内存空间,这种分配方式称为静态分配,因为变量分配到了内存的固定位置。自动分配(automatic allocation)当在函数中声明一个局部变量时,给该变量分配的空间在系统栈中。调用函数时给变量分配内存空间,函数返回时释放该空间,这种分配方式称为自动分配。动态分配(dynamic allocation)能在需要新内存的时候得到内存,不需要内存时就显式释放这部分内存,原创 2021-02-28 18:59:08 · 2649 阅读 · 0 评论 -
(十三)指针 -- 4. 指针和数组
4. 指针和数组到目前为止,本章中关于指针使用的例子仅限于指针指向某一简单变量的情况。实际上,指针可以指向任何左值。特别是,数组元素是左值,所以也有地址。数组声明double list[3];预留了三个连续的内存单元,每个单元的大小都足以存放一个double类型的值。假设double类型为8个字节长,该数组占用的内存如下图所示:三个数组元素都有地址,这些地址可使用&运算符得到。例如,表达式&list[1]的指针值为1008,因为元素list[1] 存储于该地址转载 2021-02-14 20:42:20 · 159 阅读 · 0 评论 -
(十三)指针 -- 3. 通过引用传递参数
3. 通过引用传递参数C语言中指针的最常见的应用之一,即传递指针给函数,允许该函数操作其调用程序的数据。在C语言中,把一个简单变量从一个函数传递到另一个函数时,该函数就得到了一个调用值的拷贝。在函数的语句中给参数赋一个新值会改变参数在这个函数中的局部副本,但不会影响调用参数。解决这个问题的方法之一就是给函数传递指向变量的指针,而不是传递变量本身。void SetToZero(int *ip) { *ip = 0;}为了使用这个函数,调用程序必须提供一个指向整型变量的指针。例如,要将x原创 2021-02-14 16:07:28 · 866 阅读 · 0 评论 -
(十二)查找和排序 -- 2. 排序
2. 排序排序(sorting)是把一个表 (通常表示为数组) 按某一次序重新排列。2.1 对一个整数数组排序考虑对一个整数数组排序的问题。假设有一列以任意次序排列的整数数据,需要定义一个名为SortIntegerArray的函数,使数组的元素按从小到大的顺序排列。由于函数SortIntegerArray要尽可能满足通用性,需要在函数中定义两个参数,即数组名和有效长度。其原型为:static void SortIntegerArray(int array[], int n);2.2原创 2021-01-24 11:41:48 · 133 阅读 · 0 评论 -
(十二)查找和排序 -- 1. 查找
1. 查找在 Pig Latin:一个模块化开发的案例研究 小节的piglatin.c中,函数FindFirstVowel的功能,是在一个字符串中查找第一个元音字母。函数实现为:static int FindFirstVowel(string word) { int i, length; length = StringLength(word); for (i = 0; i < length; i++) { if (IsVowel(IthChar(word,原创 2021-01-10 17:57:16 · 182 阅读 · 0 评论 -
(十一)数组 -- 6. 多维数组
6. 多维数组在C语言中,数组元素可以是任何类型的。特别是,数组的元素又是数组。这种数组的数组就叫做多维数组(multidimensional array)。多维数组中最常见的就是二维数组,它常用于表示分割成行和列的矩形的数据结构。这种二维结构的类型也叫做矩阵(matrix) 。作为二维数组的例子,假设要在程序中表述tic-tac-toe这种游戏。在一个分成三行三列的面板上,参加游戏者轮流在这些空的方块中填入X和O,尽量使相同的符号在水平方向、垂直方向或者对角线上排成一行。为了描述这种游戏的面原创 2021-01-04 20:58:52 · 152 阅读 · 0 评论 -
(十一)数组 -- 5. 数组的静态初始化
5. 数组的静态初始化为了避免使用全局变量的缺陷,除非有一些特殊要求,否则数组变量都被声明为局部变量。而且,在某一程序模块中使用的全局数组应该被声明为静态变量,以避免别的程序模块使用它们。如果一个数组被声明为静态全局变量,它的每个元素在程序运行之前可以被初始化。该过程是静态初始化的一个例子。对于数组变量,指定初始值的等号后面是对应于每个元素的一组初始值,用一对花括号把这些值括起来。例如:static int digits[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};原创 2021-01-03 11:46:20 · 1815 阅读 · 0 评论 -
(十一)数组 -- 4. 使用数组制作表格
4. 使用数组制作表格程序的数据结构反映了在实际应用领域中数据的组织形式。一般来说,只要应用中包含的数据能表示成以下列表的形式:a0,a1,a2,a3,a4,...,aN−1a_0,a_1,a_2,a_3,a_4,...,a_{N-1}a0,a1,a2,a3,a4,...,aN−1就可以选择数组来表示这组数据。下角标(subscript)一般会把数组元素的下标称作下角标。然而,对某些应用来说,不是在数组的连续元素中存放数值,而是用数据生成数组下标值。这些下标值被用来选择数组中原创 2021-01-03 10:20:31 · 860 阅读 · 0 评论 -
(十一)数组 -- 3. 数组作为参数进行传递
3. 数组作为参数进行传递由前文可知,编写大程序的关键点就是要把它分解成许多的小的函数,每一个函数都小到足以作为一个单元来理解。函数之间通过传递参数来交换信息。如果一个大的程序里面含有数组,那么在分解这个大的程序时,就需要函数把整个数组作为参数进行传递。通过一个简单的例子进行说明。假如需要编写一个名为reverse.c的程序,来实现以下功能:(1) 读入一串整型数据,直到输人0作为输入结束标志为止。(2) 将这些整型数据逆序排列。(3) 输出经过重新排列后的数据。具体运行示例如下:原创 2020-12-27 16:09:50 · 1728 阅读 · 0 评论 -
(十一)数组 -- 2. 数据的内部表示法
2. 数据的内部表示法2.1 比特、字节和字从本质上讲,计算机中所有的数值都是按照被称为比特的基本单元的形式存储的。1个比特(bit)精确记录一个数值,它可能取两种状态中的一个。如果把机器中的电路当成一个小的开关,那么可以把这两种状态标识为断开和闭合。单词bit实际上是binary digit的缩写,因此把这两种状态用0和1表示就很顺理成章。0和1这两个数字是计算机运算所基于的二进制系统所用的两个数字。因为1个比特包含的信息量极为有限,所以比特本身并没有为存储数据提供一个很方便的机制。为了原创 2020-12-26 16:37:26 · 498 阅读 · 0 评论 -
(十一)数组 -- 1. 数组
1. 数组数组(array)是一些独立数值的集合,具有两个显著的特征:(1) 数组是有序的。必须能把数组中的每个分量按顺序排列。(2) 数组是同质的。数组中的每个数值必须有同样的类型。数组中的每一个数值称为一个元素(element)。在C语言中,每个数组有两个基本特性:(1) **元素类型(**elementtype):存储在数组元素中的数值的类型。(2) 数组大小(arraysize):数组所包含的元素个数。1.1 数组声明和C语言中其他的变量一样,数组在使用前必须声明。数组声明的一原创 2020-12-15 23:09:32 · 254 阅读 · 0 评论 -
(十)模块化开发 -- 3. 实现扫描器抽象
3. 实现扫描器抽象扫描器抽象的实际流程,需要追踪传递给InitScanner的行以及行的当前位置(很可能会是个整型的下标)。常使用术语缓冲区(buffer)来指出一个内部存储区,于是:行的私有拷贝可以存在一个叫buffer的字符串变量中;当前位置存在整型变量cpos中;记录缓冲区字符串的长度的变量也是个整数,可以命名为buflen。这些变量都得在扫描器模块中声明为全局且私有:static string buffer;static int buflen;static int cpos;原创 2020-12-12 18:10:47 · 127 阅读 · 0 评论 -
(十)模块化开发 -- 2. 在模块中维护内部状态
2. 在模块中维护内部状态当调用一个典型的函数时,会声明一些局部变量,但是当函数返回时,这些变量值就被丢弃了。因为必须要记录内部状态,扫描器的实现是不允许其中的函数每次返回时都丢弃所有信息的。2.1 全局变量在函数内部声明的变量叫局部变量,局部变量仅存在于一个栈帧中。当函数返回时,其栈帧中的变量就完全消失了。全局变量(global variable)变量声明也可以在函数定义之外出现,以这种方式声明的变量称为全局变量。例如,在代码片段int g;void MyProceure(){原创 2020-12-12 11:17:20 · 368 阅读 · 0 评论 -
(十)模块化开发 -- 1. Pig Latin:一个模块化开发的案例研究
1. Pig Latin:一个模块化开发的案例研究模块化开发(modular development)把一个程序分成多个模块的技术 。为了阐述这种技术,本章给出了一个利用模块化开发能够提供明显优势的问题。这个问题是写一个程序用来从终端读入一行文本,并把这行文本中的英文转换成Pig Latin。Pig Latin是按照如下简单规则转换每个英文单词的一种自发明语言。(1) 如果单词以辅音开头,那么把起始辅音字符串(即直到第一个元音字母的所有字母)从单词开始移到单独尾部,并加上后缀ay。(2)原创 2020-12-08 23:29:22 · 684 阅读 · 0 评论 -
(十)模块化开发 -- 前言
前言把一个大的问题分解成小片段的策略的方法在程序设计过程的很多阶段都会用到。比如碰到一个50行的函数时,最好的方法是把它分成几个相互调用的小函数来完成任务。当碰到一个包含50个函数的程序时,最好的办法就是把程序再分成几个更小的源文件。每个源文件都包含一组相关的函数。模块(module)由整个程序的一部分组成的较小的源文件。可以把同一模块作为许多不同的应用程序一部分。当把一个程序分成模块的时候,选择合适的分解方法来减少模块之间相互依赖的程度是很重要的。主模块(main module)原创 2020-12-06 15:09:33 · 157 阅读 · 2 评论 -
(九)字符串和字符 -- 4. strlib.h接口
4. strlib.h接口隐含原型(implicit prototype)是一个函数调用实例,包括参数的名字。例如,RandomInteger的隐含原型为RandomInteger(low, high)。4.1 确定字符串的长度字符串的长度(length)字符串包含的字符总数(包括所有的字母、数字、空格、标点符号和特殊字符)。该功能可以通过调用strlib.h接口的StringLength(s)函数实现:StringLength("Hello, world.\n")从用户读入一原创 2020-11-28 20:22:45 · 1218 阅读 · 0 评论 -
(九)字符串和字符 -- 3. 字符串作为抽象数据类型
3. 字符串作为抽象数据类型3.1 分层抽象分层抽象(layered abstraction) :建立在不同层次结构上的抽象。用来表示字符串的分层抽象结构,如下图所示:完成输入输出的硬件设备自动在ASCII代码和屏幕或键盘上的符号之间进行转换:计算机对表示字符的整数代码应用算术运算可以处理每个字符。这些功能组成了可用于字符串的机器级的操作,形成层次结构中的最低一层。在由硬件提供的基本功能的上面,程序设计语言通常也包括一些对字符串操作的支持。可用于字符串的内嵌操作形成了层次结构中的第原创 2020-11-18 23:22:35 · 486 阅读 · 0 评论 -
(九)字符串和字符 -- 2. 字符
2. 字符2.1 数据类型char在C语言中,单个字符用数据类型char来表示,它是预定义的数据类型中的一种。类型char由一个合法值的值域和一组操作这些值的运算组成。因为char是标量类型,因此字符可用的运算集合与整数是一样的。2.2 ASCII代码单个字符在机器内部的表示方法和其他标量类型一样。基本思想是,为每个字符赋一个编号,通过把这些字符写在一个表中,然后对它们计数来实现编号过程。用于表示特定字符的代码,称为它的字符代码(character code)。例如,可以用整数1代表字母原创 2020-11-15 20:08:06 · 594 阅读 · 0 评论 -
(九)字符串和字符 -- 1. 枚举的原理
1. 枚举的原理枚举(enumeration)列出类型值域中所有元素的处理方式。枚举类型(enumeration type)通过列出它的所有元素来定义的类型。整数编码(integer encoding)为枚举类型的每个元素赋一个整数值的过程。1.1 将枚举类型表示为整数表示C语言中的枚举类型,一种方法是:显式地用int类型,然后用#define功能引入一些新的常量名。例如,定义每周中的每一天的名字:#define Sunday 0#define Monday 1#原创 2020-11-09 22:28:16 · 229 阅读 · 0 评论 -
(六)算法 -- 4. 级数展开
4. 级数展开级数展开(series expansion)函数的值通过对级数项的求和来估计。如果每加入一个新的项都会使总和更接近于一个所期望的值,则级数是收敛的,可以用此级数估计结果。4.1 Zeno悖论Zeno悖论(Zeno’s paradox)横穿房间这个过程中的每一步都是走到剩余距离的一半。已经走过的每段距离的总和,可以表示为下式:12+14+18+116+132+164+1128+...\frac{1}{2}+\frac{1}{4}+\frac{1}{8}+\frac{1}{1原创 2020-11-02 22:28:40 · 2551 阅读 · 0 评论 -
(六)算法 -- 3.数值算法
3. 数值算法数值算法(numerical algorithm)计算机用来实现如sqrt这样的数学函数的技术称为数值算法,是计算机科学的一个重要领域。3.1 连续逼近连续逼近(successive approximation)是解决数值问题的最通用策略之一,也是找出近似答案的一般策略。具体由下列步骤组成:(1) 先对答案进行猜测。(2) 一旦有了猜测值,可以用猜测值产生一个更佳的值。例如,假设测试答案太大,可以把它变小,用这个小的值作为新的猜测值。(3) 如果能保证,每一轮猜测与真实答案原创 2020-10-25 13:05:31 · 1636 阅读 · 0 评论 -
(六)算法 -- 2.计算最大公约数
2. 计算最大公约数给出两个数x和y,其最大公约数(或缩写为GCD)是能够同时被两个数整除的最大数。假设任务是写一个函数,该函数将整型数x和y作为输入,返回它们的GCD。那么,该函数的原型为:int GCD(int x, int y);利用最基本的测试算法,这个问题存在几个可用的解决方案。2.1 brute-force算法计算GCD的最简单的方法基于最通用的方法,称为brute-force方法(brute-force method)。该方法测试每一种可能性。代码实现如下:#incl原创 2020-10-20 22:45:13 · 679 阅读 · 0 评论 -
(六)算法 -- 1. 测试素数
1. 测试素数数论(number theory)研究非负整数的特性的数学领域。数论中的一个重要问题是确定一个数是否为素数。素数(prime)如果一个正整数n只能被1和它本身整除,则这个正整数n是素数。素数在研究编码的密码学(cryptography) 中起着重要的作用。在现代电子通信领域中,计算机经常用于执行编码和解码操作。许多可用的、最好的编码技术都是基于素数。设计一个确定整数n是否为素数的函数,思路:如果直接从素数的定义出发,最直接的方法是,检查是否有两个约数。由于n的约数原创 2020-10-18 19:31:59 · 397 阅读 · 0 评论