以数学算法为基础的C程序编程技巧
2017-04-14安光勇
安光勇
(六盘水师范学院,贵州六盘水,553004)
以数学算法为基础的C程序编程技巧
安光勇
(六盘水师范学院,贵州六盘水,553004)
当前,C语言已经在应用软件及系统软件的程序设计中得到广泛应用,而数学乃为计算机之始祖,同时还是决定一个计算机程序质量如何的关键。本文以一个常用程序为例,探讨不同数学算法对其所具有的影响,最后深入剖析数学算法在C程序设计中的应用意义。
数学算法;C程序;技巧;应用
1 C语言的特点分析
C语言作为国际社会当中广为流行的一种计算机高级语言,不仅能够用之编写各种系统软件,而且还能利用它编写所需要的应用软件。当前,在市场中已有许多能够用于编程的高级语言,但其中部分语法比较繁杂,不方便记忆,同时应用上也存在难度;而一些语法则比较简单,但却有着比较差的可移植性。对于C语言而言,其有着诸多高级语言所不具备的独特优势。
(1)语言紧凑、间接,使用灵活且方便。C语言共有关键字32个,控制语句的种类有9种,具有相对比较自由的程序书写形式,还将那些不重要或者不必要的成分进行了要锁,使得整体程序比较灵活与紧凑。
(2)拥有极为丰富的运算符。C语言拥有着现代化语言架构当中的各种类型的数据结构,此外,还囊括有指针型数据,对于各种比较复杂化的数据运算,均可实现与完成,且具有更加多样且灵活的结构。
(3)可移植性好。运用C语言所编写的程序,一般情况下无需进行任何修改,便能够应用在各种型号的操作系统中或计算机当中。
(4)能够直接操作硬件。自C语言诞生之日起,系统软件便大部分运用汇编语言来进行编写。因汇编语言程序对计算机硬件具有严重依赖性,具有比较差的移植性与可读性;但一般性的高级语言又无法直接操作计算机硬件,因此人们便希望能够有一种兼顾有高级语言特性与汇编语言的新语言。于是C语言便由此诞生,其不仅囊括有上述高级语言所持有的各种优点,还拥有与汇编语言较为相似的对硬件的操作功能。
2 C程序与数学方法之间的关系
数学可谓计算机字母,若无数学的基础与依据,那么便很难有计算机的现今发展,当前比较常用的数学方法,就是同时运用多种不同的数学知识,以此来编写、制定一种策略,乃是解决数学及与之相关的各种逻辑问题的重要工具。对于数学方法与数学思想而言,通常在对开展数学知识的学习与掌握中便可获取,并且还需要对它们在整个知识形成当中所起到的作用进行深彻领会,从而去认识它们的操作方法、思维程序及本质特征,逐渐实现或做到自觉灵活的将其用到所需解决的问题当中,而归纳法便为其中之一。所谓归纳法,实际就是针对各种特殊问题,或者是个别情形,结合实际需要做做出的判断,然后基于此些判断,从中经过归纳、总结与分析,最终得出内在规律,得出全体或者一般的结论,也就是扩大至一般事物判断的一种具有推理性质的方法,同时还是一种从特殊、复杂转向一般、通俗的推理方法,与之形成鲜明对应的便是,自一般到特殊的推理方法,即演绎法。正因运用了此种数学方法,使编程者能够运用循环等程序控制方法,实现了程序效率的大幅提高,此外,还能使整个程序结构变得更为美观、简洁。
3 数学方法在一个C程序设计当中的实际应用
下面列出编程人员均比较熟悉的一个例子,分别运用各种数学方法编程实现,以此对各种数学方法所决定的相应程序效率进行比较。例如:求1+2+3+4+……+100。方法一:运用最为直接的数学方法,也就是首先用1加2,然后用它们之和加上3,以此类推,最后依据对应顺序加上100,将用变量作为加数,而变量则为和程序,便可得出:
main()
{int i,sum=0;
For(i=1;i<=100;i++)
Sum+=i;
Printf(“%d”,sum);
}
运用此种直接相加的数学方法,使得for循环需要执行将近100次,方能将本题结果算出,即5050,此种算法不仅会造成大量计算机内存大大浪费,而且还会造成程序执行时间的延长。方法:运用归纳的数学方法。首先可以先将1加上100计算出来,然后再计算2+99,再后计算3+98,以此类推,各次计算结果均为101,当从中得知此规律之后,便可进行如下编程:
main()
{int i,sum=0;
For(i=1,j=100;i<=100;j--)
Sum+=i+j;
Printf(“%d”,sum);
}
从此编程便可得知,运用此种归纳的数学自算法,能够减少程序循环次数,即减少50次,因此,方法二相比于方法一,在程序质量方面更为突出。方法三:可以基于方法二适当性给予改进,然后再对数学公式Ci(C+1)/2进行灵活运用,可得出如下程序:
main()
{int sum;
Sum=(100*(1+100))/2;
Printf(“%d”,sum);
}
方法三相比于方法二,不仅使程序得到进一步的简化,而且无一次循环,仅运用简单的乘法、除法、加法便可完成此运算。
4 数学算法对C语言程序设计的意义
要想较好的将一个数学问题解决,通常有着各种方法,单尽管所用的数学方法不同,但均可运用编程方法来实现,且可能有着各种效率。因此,针对不同的编程,可运用数学分析将其予以优化,以此获取更高的执行效率。下面本文以判断一个数是否为素数为例加以分析。所谓素数实际上就是不包含1与此数本身外,不能被其它任何整数整除的数。比如13便为一素数,且除了能够被1与13整除之外,其它诸如2、3、4,……12等,均不能被整除。要对一个数n(n>=3)是否为素数哦进行判断比较简单:把n当作被除数,然后将2至(n-1)当中的各整数均依次当作除数,如若均无法被整除,那么n便为素数。依据上述描述,可设定程序代码为:
Int n,i;
Printf(“请输入一个数: ”);
Scanf(“%d”,&n);
For(i=2;i<=(n-1);i++)/*2到(n-1)的各整数轮流当作除数*/
{
If(n%i==0)
Break;
}
If(i<=(n-1))
{
Printf(“此数不为素数 ”);
Printf(“计算次数为:%d ”,i-1)
}
else
{
Printf(“此数不为素数 ”);
Printf(“计算次数为:%d ”,i-2)
}
针对上述做法而言,乃是结合素数的定义最为普通、最容易得到的一个数学算法,如若此数数值非常大,则同样会有比较长的程序运行时间。因此,对此算法实施数学分析:n无需被2至(n-1)当中的所有整数均整除,仅需被2到n/2间的整数整除便可,从而仅需被3到n/3间的整数除便可,以此类推,最终仅需被n到n 的整数除便可,因此,可缩小除数的范围,即2-n 。根据上述分析,便可对程序代码予以改进:
Int n,i;
Printf(“请输入一个数: ”);
Scanf(“%d”,&n);
K=sqrt(n);
For(i=2;i<=k;i++)
{
If(n%i==0)
Break;
}
If(i<=k)
{
Printf(“此数不为素数 ”);
Printf(“计算次数为:%d ”,i-1)
}
else
{
Printf(“此数不为素数 ”);
Printf(“计算次数为:%d ”,i-2)
}
由此可知,通过算法改进之后,程序当中的计算次数由此而得到大幅减少,在时间复杂度方面,也从之前的O(n)下降至O(logn)。诸如此种题型的多种算法,在整个程序设计当中较为常见,要求我们在实际解决问题过程中,在对应数学解决方案当中,善于进行选择与比较,整个C程序设计变得更加高效、更为简洁。
5 结语
总而言之,上述内容乃为笔者在日常工作当中所总结的一些体会。如若能够将数学方法充分而又灵活的运用,便能够使原本枯燥而又复杂的程序工作,变得更为有趣且简单。针对同一问题,运用各种数学方法予以解决,最终所得到的乃是完全不同的程序质量。针对现实的程序开发与生产应用而言,便可大幅提升实际效率。
[1]马宝秋.模糊C均值聚类算法编程实现及应用[J].石家庄职业技术学院学报,2016,28(2):30-33.
[2]谢刚.一种C程序的函数调用图生成算法的设计与实现[J].贵州师范大学学报(自然版),2009,27(4):77-80.
[3]薛申芳.数学建模中的MATLAB程序在C语言下的实现[J].邢台学院学报,2006,21(4):91-94.
C programming skills based on mathematical algorithms
An Gaungyong
(Liupanshui Normal College,Liupanshui Guizhou,553004)
At present, C language has been widely used in the design of application software and system software, and mathematics is the ancestor of the computer, and it is also the key to determine the quality of a computer program. In this paper, a common program is used as an example to discuss the influence of different mathematical algorithms on it. Finally, the application of mathematical algorithm in C programming is analyzed.
Mathematical Algorithm; C program; Skill; Application