① 设计要求 (1)先用C语言描述正确的计算最大公约数的算法 ,保证算法的正确性 (2)然后设计一个该算法的
欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a, d|b,而r = a - kb,因此d|r
因此d也是(b,a mod b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:
1. 若 r 是 a ÷ b 的余数, 则
gcd(a,b) = gcd(b,r)
2. a 和其倍数之最大公因子为 a。
另一种写法是:
1. 令r为a/b所得余数(0≤r<b)
若 b= 0,算法结束;a 即为答案。
2. 互换:置 a←b,b←r,并返回第一步。
欧几里德算法的C语言版
/*欧几里德算法:辗转求余
原理: gcd(a,b)=gcd(b,a mod b)
当b为0时,两数的最大公约数即为a
getchar()会接受前一个scanf的回车符
*/
#include<stdio.h>
unsigned int Gcd( unsigned int M, unsigned int N )
{
unsigned int Rem;
while( N > 0 )
{
Rem = M % N;
M = N;
N = Rem;
}
return M;
}
void main()
{
int temp;
int a,b;
scanf("%d",&a);
scanf("%d",&b);
printf("the greatest common factor of %d and %d is ",a,b);
printf("%d\n",Gcd(a,b));
}
② 在计算数学中,您认为如何让学生既理算理,又掌握算法,还能提高计算的准确性
针对上述原因,我从多方面学习借鉴,再结合自己的教学实践谈谈在计算教学中对如何正确处理算法与算理的关系,努力提高课堂教学时效的看法。
一、加强理论学习,提高自身理论素养。
教师在平常的工作中不断加强理论学习,尤其要正确解读新课标,科学的把握新教材,理念先到位,对算理与算法的怎样算、为什么这样算理解清楚,做到算理算法互相渗透,合理安排教学时间,提高教学时效。
二、精心设计,正确处理算法与算理的关系
由于第一年教学计算时没有经验,虽然教学设计中注意到了算法与算理并重,可学生说算理时说不起来,教师只有慢慢引导,直至学生能说清楚算理,可待到学生说清算理后,还没来得及练习算法,下课铃响了,一堂课的教学任务没能完成。第二年再教时,我就重点注意了算法与算理的正确处理。
1、算理应是学生在自主探索中建构
在计算碰到新问题时总有相当多的学生会应用已有的经验想办法解决问题,教师应为学生提供探索的空间,交流的平台,在交流中明白一个个算理,从而发展学生的思考能力,不但能提升认识,还能为新知的学习打下基础,缩短教学的时间。
2、展现多种算理时要找到突破点。
叶澜教授说过,没有聚焦的发散是没有价值的,聚焦的目的是为了发展。为此,在交流多种想法时,教师要善于抓住恰当的一种切入口,大部分学生容易理解的进行突破。这样效率就提高了。
例如:教学十几减9时,学生出现了好多种算法,如果要一一解释每个学生的算理确实要花好长时间,而且其他学生还会有一种云里雾里的感觉,结果什么都不清楚,因为每种计算都会有一般的算法,为后续学习打基础的。这时教师只有选择其中最容易理解的破十法和想加算减这两种方法讲解,让学生理解算理。这样既能让所有学生都能理解又提高了教学效率。
3、注重算理与算法的沟通。
算理是算法的基础,当学生明白了算理后,教师及时落实算法与算理的联系,有利于对算法的掌握。
4、基本算法需要重点强化练习。
一节课有教学目标及教学重点,在多种算法中有基本算法,这种基本算法对后续学习又有很大的影响。所以对基本的算法有必要进行强化,努力使每一个学生都会。针对上述十几减9的例子,破十法和想加算减的方法就是基本算法,进行强化训练,对后面的十几减8、7、6、……都有很大的作用。
三、课堂上保证新算法的练习时间和练习量
在新的计算方法教学的第一课时留有一定的时间完成一定的练习量,能从学生的反馈中了解学生的学习情况,对学生在计算方法上出现的错误及时纠正,这样就能将学生的错误消灭在萌芽状态。对掌握算法,初步形成计算技能还是十分必要的。
例如:在教学两位数加减两位数笔算时。本课的难点是一位数加两位数的竖式写法,虽然学生已经通过摆小棒、在计数器上拨算珠知道了列竖式要注意相同数位对齐的算理,但是否完全理解呢?通过集体讨论明白算理后,及时组织学生进行练习。首先指名板演,请两个中下生上黑板做,其余一起看。这时两人的计算过程一览无余,一人正确,另一人却将一位数与两位数的十位对齐了,显然没有理解相同数位对齐的意思,算理不清楚。经全班同学的点评,这位学生明白了自己的错误。在后来的课堂作业中就没有发生类似的错误。如果单靠讲算理,而没有及时练习巩固,这个错误就会延续到第二课,而到了第二课难道还要再演示、再讲一遍?课堂的效益从何而来?
四、改变计算教学的模式,给予理解算理的空间。
计算教学常常借助一定的情境作为一节课的引入,通过情境让学生提出数学问题,列出算式,探索出结果。情景的创设,能拨动学生思维之弦,激活求知欲,唤起好奇心,使看似枯燥、抽象的数学知识充满亲和力和吸引力。而计算教学一定要借助情境吗?没有情境,学生能够自己寻找到解决问题的方法吗?
总之,计算教学中理解算理与掌握算法不可偏颇,“重算理、轻算法”和“重算法、轻算理”都不可取。正确地处理好他们之间的关系,才能有效的提高课堂教学效率。
③ 什么是结构化程序设计方法
c语言中"结构化程序设计方法”的基本思想和规则C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。
C源程序的结构特点
1.一个C语言源程序可以由一个或多个源文件组成。
2.每个源文件可由一个或多个函数组成。
3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。
4.源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。
5.每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。
6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
书写程序时应遵循的规则
从书写清晰,便于阅读,理解,维护的角度出发,在书写程序时 应遵循以下规则:
1.一个说明或一个语句占一行。
2.用{} 括起来的部分,通常表示了程序的某一层次结构。{}一般与该结构语句的第一个字母对齐,并单独占一行。
3.低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。以便看起来更加清晰,增加程序的可读性。在编程时应力求遵循这些规则,以养成良好的编程风格。
④ 设计算法找出三个数中的最大值
有a,b,c三个数,比较它们的大小
方法一,按顺序两两比较,取较大的
if (a > b) {
max = a;
} else {
max = b;
}
if (max < c) {
max = c;
}
方法二,假设第一个是最大的,与后面两个数进行比较,将较大的值赋给max
int max = a;
if (b > max) {
max = b;
}
if (c > max) {
max = c;
}
1、什么是算法
算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。
mark:我们可以把所有的算法想象为一本“菜谱”,特定的算法比如菜谱中的的一道“老醋花生米”的制作流程,只要按照菜谱的要求制作老醋花生米,那么谁都可以做出一道好吃的老醋花生米。so,这个做菜的步骤就可以理解为:“解决问题的步骤”
2、算法的意义
假设计算机无限快,并且计算机存储容器是免费的,我们还需要各种乱七八糟的算法吗?如果计算机无限快,那么对于某一个问题来说,任何一个都可以解决他的正确方法都可以的!
当然,计算机可以做到很快,但是不能做到无限快,存储也可以很便宜但是不能做到免费。
那么问题就来了效率:解决同一个问题的各种不同算法的效率常常相差非常大,这种效率上的差距的影响往往比硬件和软件方面的差距还要大。
3、如何选择算法
第一首先要保证算法的正确性
一个算法对其每一个输入的实例,都能输出正确的结果并停止,则称它是正确的,我们说一个正确的算法解决了给定的计算问题。不正确的算法对于某些输入来说,可能根本不会停止,或者停止时给出的不是预期的结果。然而,与人们对不正确算法的看法想反,如果这些算法的错误率可以得到控制的话,它们有时候也是有用的。但是一般而言,我们还是仅关注正确的算法!
第二分析算法的时间复杂度
算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的好坏。
⑤ 算法的正确性如何检验
我这学期也正在学数据结构,学的那个晕那,写的只是代码而已,也就是说是编程的思路。如果你要证明,那就得用具体的程序带入吧。我师傅说,数据结构是编程的重心,最重要了。所以好好学吧。
⑥ 如何才能设计出优秀的算法
数据结构中评价一个好的算法,应该从四个方面来考虑,分别是:
一、算法的正确性。
二、算法的易读性。
三、是算法的健壮性。
四、是算法的时空效率(运行)。
算法的设计取决于数据(逻辑)结构,算法的实现取决于所采用的存储结构。数据的存储结构本质上是其逻辑结构在计算机存储器中的实现。为了充分反映数据的逻辑结构,它在内存中的映像包括两个方面,即数据元素之间的信息和数据元素之间的关系。不同的数据结构有相应的操作。数据操作是定义在数据逻辑结构上的操作算法,如检索、插入、删除、更新和排序。
(6)保证算法的正确性的方法扩展阅读
该算法的一般性质包括:
1、对于任何符合输入类型的输入数据,都可以根据算法来解决问题,软件包保证了计算结构的正确性。
2、算法中的每一条指令都必须能够被人或机器执行。
3、确定性算法应该在每一步之后都有明确的下一步指示。也就是说,确保每个步骤都有下一步行动的指示,并且不缺乏或只有模糊的下一步行动指示。
4、有限算法的执行必须以有限的步数结束。
⑦ 在算法实现中,算法的正确性如何保证
算法本身的正确性用逻辑推理来证明,和数学定理类似
实现算法的程序的正确性则是两码事
简单的程序也用逻辑推理来证明,稍复杂的可以用某些专门验证程序正确性的程序来验证,再复杂的就没什么好办法了,事实上很多复杂的程序在比较极端的输入下或多或少都会有点问题
⑧ 数据结构中评价一个好的算法,应该从哪几个方面来考虑
数据结构中评价一个好的算法,应该从四个个方面来考虑,分别是:
一、算法的正确性。
二、算法的易读性。
三、是算法的健壮性。
四、是算法的时空效率(运行)。
算法的设计取决于数据(逻辑)结构,而算法的实现依赖于采用的存储结构。数据的存储结构实质上是它的逻辑结构在计算机存储器中的实现,为了全面的反映一个数据的逻辑结构,它在存储器中的映象包括两方面内容,即数据元素之间的信息和数据元素之间的关系。
不同数据结构有其相应的若干运算。数据的运算是在数据的逻辑结构上定义的操作算法,如检索、插入、删除、更新和排序等。
(8)保证算法的正确性的方法扩展阅读:
分类
1、集合结构。该结构的数据元素间的关系是“属于同一个集合”。
2、线性结构。该结构的数据元素之间存在着一对一的关系。
3、树型结构。该结构的数据元素之间存在着一对多的关系。
4、图形结构。该结构的数据元素之间存在着多对多的关系,也称网状结构。
⑨ 在结构化程序设计方法中,三种基本结构是
1、顺序结构:按照它们出现的先后顺序执行的。
2、选择结构:需要根据某一特定的条件选择其中的一个分支执行。选择结构有单选择、双选择和多选择三种形式。
3、循环结构:循环结构表示程序反复执行某个或某些操作,直到某条件为假(或为真)时才可终止循环。
由顺序、选择和循环三种基本程序结构通过组合、嵌套构成,那么这个新构造的程序一定是一个单入口单出口的程序。据此就很容易编写出结构良好、易于调试的程序来。
结构化程序设计方法的主要原则可以概括为自顶向下、逐步求精、模块化及限制使用goto语句,总的来说可使程序结构良好、易读、易理解、易维护。
(9)保证算法的正确性的方法扩展阅读:
按照结构化程序设计的观点,任何算法功能都可以通过由程序模块组成的三种基本程序结构的组合:顺序结构、选择结构和循环结构来实现。
"单入口单出口"的思想认为一个复杂的程序,如果它仅是由顺序、选择和循环三种基本程序结构通过组合、嵌套构成,那么这个新构造的程序一定是一个单入口单出口的程序。据此就很容易编写出结构良好、易于调试的程序来。
⑩ 如何提高算法
计算的准确性不但在“应试教育”中占主要地位,在“素质教育”的今天同样重要。因为式子题的计算是学生解决实际问题的基础,是每个小学生必须掌握的数学基础知识和基本技能。只有计算过硬,才能进一步学好应用题和其他学科知识。式子题计算是各年级的重要内容,根据学生的考试和作业看,造成成绩不理想的原因是计算能力差,准确率不高。造成这种现象的原因是多方面的:首先是低年级忽略了口算训练,其次是在各年级中轻视了式子题的教学,误认为计算式子题只要弄清计算顺序,便能算出来,这种想法造成学生计算不细心,准确率低,从而缺乏攻克复杂式子题的兴趣和信心。
计算准确,要从低年级抓起,不仅要教学生算法,更要重视口算的训练。口算是笔算、估算的基础,只有让学生在理解的基础上掌握了口算的方法,坚持练习,逐步达到熟练的程度,才会在中、高年级中熟练、准确地计算。同样,中高年级也不能忽视口算的练习。
式子题的训练,还要从读题做起,读题要求学生正确规范,这样有助于弄清运算顺序。有括号题,如(a+b)c,可读作a与b的和乘以c,不能把括号读出来,严格要求学生读准,从中悟出运算顺序,确定自己的算法。弄清计算顺序是计算的前期。不这样训练,学生容易忽略和弄错顺序,对“准确”没有把握,长期这样,学生会对数学失去信心,失去积极性,教师也会对学生的计算失去信心。
文字题是式子题的读题与列式计算的训练,在读题的基础上,让学生列出算式,正反结合训练,会对学生的计算进行强化。文字题既然是计算题的叙述,那么解决文字题就是列出综合算式,它与应用题的解答有别,不能用分步计算,但可以用分步式分析。分析后列出综合计算是解决文字题的正确做法。
加强运算定律和运算性质的教学,多用于实际计算,让学生充分理解算理,掌握法则,鼓励学生运用简便算法。除题目要求简算外,教师要有意识地要求学生能简算的奥运用简算,提高学生的简算兴趣,使简算贯穿于一切计算之中,逐步摸索计算的技巧,做到计算合理,灵活,准确,迅速,有力的提高学生的计算能力。
计算准确性的训练要常抓不懈,养成检查、验算的习惯。对于一般的学生,式子题做完了不愿意检查、验算,造成准确率低的现象。针对这种现象,要有意识的训练,培养学生验算,长此以往,“准确”就有保证了。
在式子题的计算中,采用适当的计算方法也要给与指导和练习。如高年级的分数、小数、百分数的混合运算,要根据题和自己的特长确定具体算法。让学生针对题型动脑思考,自做练习,在和他人比较,找到巧妙的算法,也是准确性的训练。
对学生经过长期多方面的计算训练,培养学生严格、认真、对计算结果负责的良好习惯以及有毅力、肯动脑、克服困难的意志,学生的计算能力就会明显提高,为下一步学习打下坚实基础