安光勇
(六盤水師范學院,貴州六盤水,553004)
以數(shù)學算法為基礎(chǔ)的C程序編程技巧
安光勇
(六盤水師范學院,貴州六盤水,553004)
當前,C語言已經(jīng)在應(yīng)用軟件及系統(tǒng)軟件的程序設(shè)計中得到廣泛應(yīng)用,而數(shù)學乃為計算機之始祖,同時還是決定一個計算機程序質(zhì)量如何的關(guān)鍵。本文以一個常用程序為例,探討不同數(shù)學算法對其所具有的影響,最后深入剖析數(shù)學算法在C程序設(shè)計中的應(yīng)用意義。
數(shù)學算法;C程序;技巧;應(yīng)用
C語言作為國際社會當中廣為流行的一種計算機高級語言,不僅能夠用之編寫各種系統(tǒng)軟件,而且還能利用它編寫所需要的應(yīng)用軟件。當前,在市場中已有許多能夠用于編程的高級語言,但其中部分語法比較繁雜,不方便記憶,同時應(yīng)用上也存在難度;而一些語法則比較簡單,但卻有著比較差的可移植性。對于C語言而言,其有著諸多高級語言所不具備的獨特優(yōu)勢。
(1)語言緊湊、間接,使用靈活且方便。C語言共有關(guān)鍵字32個,控制語句的種類有9種,具有相對比較自由的程序書寫形式,還將那些不重要或者不必要的成分進行了要鎖,使得整體程序比較靈活與緊湊。
(2)擁有極為豐富的運算符。C語言擁有著現(xiàn)代化語言架構(gòu)當中的各種類型的數(shù)據(jù)結(jié)構(gòu),此外,還囊括有指針型數(shù)據(jù),對于各種比較復(fù)雜化的數(shù)據(jù)運算,均可實現(xiàn)與完成,且具有更加多樣且靈活的結(jié)構(gòu)。
(3)可移植性好。運用C語言所編寫的程序,一般情況下無需進行任何修改,便能夠應(yīng)用在各種型號的操作系統(tǒng)中或計算機當中。
(4)能夠直接操作硬件。自C語言誕生之日起,系統(tǒng)軟件便大部分運用匯編語言來進行編寫。因匯編語言程序?qū)τ嬎銠C硬件具有嚴重依賴性,具有比較差的移植性與可讀性;但一般性的高級語言又無法直接操作計算機硬件,因此人們便希望能夠有一種兼顧有高級語言特性與匯編語言的新語言。于是C語言便由此誕生,其不僅囊括有上述高級語言所持有的各種優(yōu)點,還擁有與匯編語言較為相似的對硬件的操作功能。
數(shù)學可謂計算機字母,若無數(shù)學的基礎(chǔ)與依據(jù),那么便很難有計算機的現(xiàn)今發(fā)展,當前比較常用的數(shù)學方法,就是同時運用多種不同的數(shù)學知識,以此來編寫、制定一種策略,乃是解決數(shù)學及與之相關(guān)的各種邏輯問題的重要工具。對于數(shù)學方法與數(shù)學思想而言,通常在對開展數(shù)學知識的學習與掌握中便可獲取,并且還需要對它們在整個知識形成當中所起到的作用進行深徹領(lǐng)會,從而去認識它們的操作方法、思維程序及本質(zhì)特征,逐漸實現(xiàn)或做到自覺靈活的將其用到所需解決的問題當中,而歸納法便為其中之一。所謂歸納法,實際就是針對各種特殊問題,或者是個別情形,結(jié)合實際需要做做出的判斷,然后基于此些判斷,從中經(jīng)過歸納、總結(jié)與分析,最終得出內(nèi)在規(guī)律,得出全體或者一般的結(jié)論,也就是擴大至一般事物判斷的一種具有推理性質(zhì)的方法,同時還是一種從特殊、復(fù)雜轉(zhuǎn)向一般、通俗的推理方法,與之形成鮮明對應(yīng)的便是,自一般到特殊的推理方法,即演繹法。正因運用了此種數(shù)學方法,使編程者能夠運用循環(huán)等程序控制方法,實現(xiàn)了程序效率的大幅提高,此外,還能使整個程序結(jié)構(gòu)變得更為美觀、簡潔。
下面列出編程人員均比較熟悉的一個例子,分別運用各種數(shù)學方法編程實現(xiàn),以此對各種數(shù)學方法所決定的相應(yīng)程序效率進行比較。例如:求1+2+3+4+……+100。方法一:運用最為直接的數(shù)學方法,也就是首先用1加2,然后用它們之和加上3,以此類推,最后依據(jù)對應(yīng)順序加上100,將用變量作為加數(shù),而變量則為和程序,便可得出:
main()
{int i,sum=0;
For(i=1;i<=100;i++)
Sum+=i;
Printf(“%d”,sum);
}
運用此種直接相加的數(shù)學方法,使得for循環(huán)需要執(zhí)行將近100次,方能將本題結(jié)果算出,即5050,此種算法不僅會造成大量計算機內(nèi)存大大浪費,而且還會造成程序執(zhí)行時間的延長。方法:運用歸納的數(shù)學方法。首先可以先將1加上100計算出來,然后再計算2+99,再后計算3+98,以此類推,各次計算結(jié)果均為101,當從中得知此規(guī)律之后,便可進行如下編程:
main()
{int i,sum=0;
For(i=1,j=100;i<=100;j--)
Sum+=i+j;
Printf(“%d”,sum);
}
從此編程便可得知,運用此種歸納的數(shù)學自算法,能夠減少程序循環(huán)次數(shù),即減少50次,因此,方法二相比于方法一,在程序質(zhì)量方面更為突出。方法三:可以基于方法二適當性給予改進,然后再對數(shù)學公式Ci(C+1)/2進行靈活運用,可得出如下程序:
main()
{int sum;
Sum=(100*(1+100))/2;
Printf(“%d”,sum);
}
方法三相比于方法二,不僅使程序得到進一步的簡化,而且無一次循環(huán),僅運用簡單的乘法、除法、加法便可完成此運算。
要想較好的將一個數(shù)學問題解決,通常有著各種方法,單盡管所用的數(shù)學方法不同,但均可運用編程方法來實現(xiàn),且可能有著各種效率。因此,針對不同的編程,可運用數(shù)學分析將其予以優(yōu)化,以此獲取更高的執(zhí)行效率。下面本文以判斷一個數(shù)是否為素數(shù)為例加以分析。所謂素數(shù)實際上就是不包含1與此數(shù)本身外,不能被其它任何整數(shù)整除的數(shù)。比如13便為一素數(shù),且除了能夠被1與13整除之外,其它諸如2、3、4,……12等,均不能被整除。要對一個數(shù)n(n>=3)是否為素數(shù)哦進行判斷比較簡單:把n當作被除數(shù),然后將2至(n-1)當中的各整數(shù)均依次當作除數(shù),如若均無法被整除,那么n便為素數(shù)。依據(jù)上述描述,可設(shè)定程序代碼為:
Int n,i;
Printf(“請輸入一個數(shù): ”);
Scanf(“%d”,&n);
For(i=2;i<=(n-1);i++)/*2到(n-1)的各整數(shù)輪流當作除數(shù)*/
{
If(n%i==0)
Break;
}
If(i<=(n-1))
{
Printf(“此數(shù)不為素數(shù) ”);
Printf(“計算次數(shù)為:%d ”,i-1)
}
else
{
Printf(“此數(shù)不為素數(shù) ”);
Printf(“計算次數(shù)為:%d ”,i-2)
}
針對上述做法而言,乃是結(jié)合素數(shù)的定義最為普通、最容易得到的一個數(shù)學算法,如若此數(shù)數(shù)值非常大,則同樣會有比較長的程序運行時間。因此,對此算法實施數(shù)學分析:n無需被2至(n-1)當中的所有整數(shù)均整除,僅需被2到n/2間的整數(shù)整除便可,從而僅需被3到n/3間的整數(shù)除便可,以此類推,最終僅需被n到n 的整數(shù)除便可,因此,可縮小除數(shù)的范圍,即2-n 。根據(jù)上述分析,便可對程序代碼予以改進:
Int n,i;
Printf(“請輸入一個數(shù): ”);
Scanf(“%d”,&n);
K=sqrt(n);
For(i=2;i<=k;i++)
{
If(n%i==0)
Break;
}
If(i<=k)
{
Printf(“此數(shù)不為素數(shù) ”);
Printf(“計算次數(shù)為:%d ”,i-1)
}
else
{
Printf(“此數(shù)不為素數(shù) ”);
Printf(“計算次數(shù)為:%d ”,i-2)
}
由此可知,通過算法改進之后,程序當中的計算次數(shù)由此而得到大幅減少,在時間復(fù)雜度方面,也從之前的O(n)下降至O(logn)。諸如此種題型的多種算法,在整個程序設(shè)計當中較為常見,要求我們在實際解決問題過程中,在對應(yīng)數(shù)學解決方案當中,善于進行選擇與比較,整個C程序設(shè)計變得更加高效、更為簡潔。
總而言之,上述內(nèi)容乃為筆者在日常工作當中所總結(jié)的一些體會。如若能夠?qū)?shù)學方法充分而又靈活的運用,便能夠使原本枯燥而又復(fù)雜的程序工作,變得更為有趣且簡單。針對同一問題,運用各種數(shù)學方法予以解決,最終所得到的乃是完全不同的程序質(zhì)量。針對現(xiàn)實的程序開發(fā)與生產(chǎn)應(yīng)用而言,便可大幅提升實際效率。
[1]馬寶秋.模糊C均值聚類算法編程實現(xiàn)及應(yīng)用[J].石家莊職業(yè)技術(shù)學院學報,2016,28(2):30-33.
[2]謝剛.一種C程序的函數(shù)調(diào)用圖生成算法的設(shè)計與實現(xiàn)[J].貴州師范大學學報(自然版),2009,27(4):77-80.
[3]薛申芳.數(shù)學建模中的MATLAB程序在C語言下的實現(xiàn)[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