C语言中算法研究
C语言中算法研究
摘要: 《C语言程序设计》是计算机相关专业学生的专业基础课,对于其他后续专业课程的学习有着至关重要的作用。而在C语言课程的学习中,循环结构是一个难点也是一个重点。通过研究循环结构中的经典案例求两个数的最大公约数,以期寻求一种更好的更容易接受的算法,来提高学生学习的积极性,达到学习和教学的目的。
关键词: C语言;循环;最大公约数;算法
中图分类号:TP312 文献标识码:A 文章编号:1671-7597(2011)0520097-01
0 引言
《C语言程序设计》是计算机专业学生的专业基础课,C语言是其它高级语言的基础,所以学生对于该课程的掌握程度直接影响后续专业课的学习。顺序、分支、循环是结构化程序设计的三种基本结构,对于初学者来说,循环结构程序设计又是该课程的一个难点和重点,由于它与人类日常的思维习惯不同,较难掌握。笔者本文通过研究循环结构中的经典案例求两个数的最大公约数,探讨一种学生更容易接受的算法思想,带动他们对循环结构的理解和学习。
1 C语言中的循环结构
循环结构是结构化程序设计中的三种基本结构之一,几乎所有的程序都离不开循环结构。在C语言中,循环结构主要是由while语句、do-while语句和for语句来实现的。while语句、do-while语句和for语句都可以处理同一个问题,它们可以通过语句的调整来相互替代。但是在实际应用中要根据问题的特点,来选用相应的循环语句。while语句和do-while语句,只在while语句后面指定循环条件,在循环体中应包含使循环趋向于结束的语句;而for语句则可在表达式3中完成。while语句和do-while语句的赋初值是在循环语句之前完成,而for语句的赋初值一般是在表达式1中完成的。因为while语句在循环之前判别循环条件,所以循环体有可能一次也不执行(当循环条件一开始就为假时),而do-while语句在循环之后判别循环条件,所以循环体至少执行一次。一般来说,for语句要比while语句和do-while语句功能更强,凡是while语句和do-while语句能完成的操作for语句均能完成。
2 最大公约数算法
在C语言的循环结构程序设计学习中,求两个数的最大公约数是一个经典的案例。对于该案例,当前教程上一般采用以下两种算法来解决。
1)辗转相除法
算法思想如下:
两个数相除,若余数为0,则除数就是这两个数的最大公约数。若余数不为0,则以除数作为新的被除数,以余数作为新的除数,继续相除,直到余数为0,除数即为这两数的最大公约数。例如:a=32,b=12,求a和b的最大公约数。按照上面的算法计算如下:
32%12的值为8,不为0;12%8的值为4,不为0;8%4的值为0,所以a和b的最大公约数是4。
程序如下:
main()
{
int x,y,a,b,t;
scanf(“%d,%d”,&x,&y);
a=x;b=y;
t=a%b;
while(t!=0)
{a=b;b=t;t=a%b;}
printf(“gys=%d\n”,b);
}
2)相减法
算法思想如下:
两个数中从大数中减去小数,所得的差若与小数相等,则该数为最大公约数。
若不等,对所得的差和小数,继续从大数中减去小数,直到两个数相等为止。我们仍然以a=32,b=12为例,32-12=20(20>12),20-12=8
(8<12),12-8=4(4<8),8-4=4(4=4),所以,32和12的最大公约数为4。
程序如下:
main()
{
int x,y,a,b,t;
scanf(“%d,%d”,&x,&y);
a=x;b=y;
while(a!=b)
if(a>b)
a=a-b;
else
b=b-a;
printf(“gys=%d\n”,a);
}
上述两种算法在具体的教学过程中都有一个共同的特点,就是尽管可以使用和实现,但是对于大多数初学者来说对于这两种算法的思想并不理解。所以教师在讲解的过程中要花费相当多的时间去帮助学生理解算法的原理,让学生来接受。实际教学效果也并不理想,讲解完后,学生还是云里雾里,似懂非懂,这样也严重影响学生学习程序设计课程的积极性,影响后面章节的学习。
3 一种新的算法-筛选法
作者在实际教学中针对该案例进行分析,结合学生的学习习惯和接受程度决定采用一种改进的算法,即筛选法。算法思想如下:
首先我们来分析一下两个数的最大公约数所具备的特点,例如a=32,b=12。经过分析