C語言常用而經典的演算法

2022-03-23 16:22:24 字數 3000 閱讀 2007

一、基本演算法交換、累加、累乘

二、非數值計算常用經典演算法窮舉、排序冒泡選擇 、查詢順序即線性

三、數值計算常用經典演算法級數計算直接、簡接即遞推 、一元非線性方程求根牛頓迭代法、二分法 、定積分計算矩形法、梯形法 、矩陣轉置

四、其他迭代、進製轉換、字元處理統計、數字串、字母大小寫轉換、加密等 、整數各數字上數字的獲取、輾轉相除法求最大公約數最小公倍數 、求最值、判斷素數各種變形 、陣列元素的插入刪除 、二維陣列的其他典型問題方陣的特點、楊輝三角形

一、基本演算法

1.交換(兩量交換借助第三者)

例1、任意讀入兩個整數,將二者的值交換後輸出。

main()

【解析】程式中加粗部分為演算法的核心,如同交換兩個杯子裡的飲料,必須借助第三個空杯子。

假設輸入的值分別為3、7,則第一行輸出為3,7;第二行輸出為7,3。

其中t為中間變數,起到「空杯子」的作用。

注意:三句賦值語句賦值號左右的各量之間的關係!

【應用】

例2、任意讀入三個整數,然後按從小到大的順序輸出。

main()

if(a>c)

/*以下if語句使得b中存放的數次小*/

if(b>c)

printf("%d,%d,%d\n",a,b,c);}

2.累加

累加演算法的要領是形如「s=s+a」的累加式,此式必須出現在迴圈中才能被反覆執行,從而實現累加功能。「a」通常是有規律變化的表示式,s在進入迴圈前必須獲得合適的初值,通常為0。

例1、求1+2+3+……+100的和。

main()

printf("1+2+3+...+100=%d\n",s);}

【解析】程式中加粗部分為累加式的典型形式,賦值號左右都出現的變數稱為累加器,其中「i = i + 1」為特殊的累加式,每次累加的值為1,這樣的累加器又稱為計數器。

3.累乘

累乘演算法的要領是形如「s=s*a」的累乘式,此式必須出現在迴圈中才能被反覆執行,從而實現累乘功能。「a」通常是有規律變化的表示式,s在進入迴圈前必須獲得合適的初值,通常為1。

例1、求10!

[分析]10!=1×2×3×……×10

main()

printf("1*2*3*...*10=%ld\n",c);}

二、非數值計算常用經典演算法

1.窮舉

也稱為「列舉法」,即將可能出現的每一種情況一一測試,判斷是否滿足條件,一般採用迴圈來實現。

例1、用窮舉法輸出所有的水仙花數(即這樣的三位正整數:其每位數字上的數字的立方和與該數相等,比如:13+53+33=153)。

[法一]

main()

}【解析】此方法是將100到999所有的三位正整數一一考察,即將每乙個三位正整數的個位數、十位數、百位數一一求出(各數字上的數字的提取演算法見下面的「數字處理」),算出三者的立方和,一旦與原數相等就輸出。共考慮了900個三位正整數。

[法二]

main()

【解析】此方法是用1到9做百位數字、0到9做十位和個位數字,將組成的三位正整數與每一組的三個數的立方和進行比較,一旦相等就輸出。共考慮了900個組合(外迴圈單獨執行的次數為9,兩個內迴圈單獨執行的次數分別為10次,故if語句被執行的次數為9×10×10=900),即900個三位正整數。與法一判斷的次數一樣。

2.排序

(1)氣泡排序(起泡排序)

假設要對含有n個數的序列進行公升序排列,氣泡排序演算法步驟是:

①從存放序列的陣列中的第乙個元素開始到最後乙個元素,依次對相鄰兩數進行比較,若前者大後者小,則交換兩數的位置;

②第①趟結束後,最大數就存放到陣列的最後乙個元素裡了,然後從第乙個元素開始到倒數第二個元素,依次對相鄰兩數進行比較,若前者大後者小,則交換兩數的位置;

③重複步驟①n-1趟,每趟比前一趟少比較一次,即可完成所求。

例1、任意讀入10個整數,將其用冒泡法按公升序排列後輸出。

#define n 10

main()

for(i=0;i(2)選擇法排序

選擇法排序是相對好理解的排序演算法。假設要對含有n個數的序列進行公升序排列,演算法步驟是:

①從陣列存放的n個數中找出最小數的下標(演算法見下面的「求最值」),然後將最小數與第1個數交換位置;

②除第1個數以外,再從其餘n-1個數中找出最小數(即n個數中的次小數)的下標,將此數與第2個數交換位置;

③重複步驟①n-1趟,即可完成所求。

例1、任意讀入10個整數,將其用選擇法按公升序排列後輸出。

#define n 10

main()

}for(i=0;i printf("%d\n",a[i]); }

(3)插入法排序

要想很好地掌握此演算法,先請了解「有序序列的插入演算法」,就是將某資料插入到乙個有序序列後,該序列仍然有序。插入演算法參見下面的「陣列元素的插入」。

例1、將任意讀入的整數x插入一公升序數列後,數列仍按公升序排列。

#define n 10

main()

,x,j,k; /*注意留乙個空間給待插數*/

scanf("%d",&x);

if(x>a[n-2]) a[n-1]=x ; /*比最後乙個數還大就往最後乙個元素中存放*/

else /*查詢待插位置*/

for(j=0;j<=n-1;j++) printf("%d ",a[j]);

}插入法排序的要領就是每讀入乙個數立即插入到最終存放的陣列中,每次插入都使得該陣列有序。

例2、任意讀入10個整數,將其用插入法按降序排列後輸出。

#define n 10

main()

} for(i=0;i}

(4)歸併排序

即將兩個都公升序(或降序)排列的資料序列合併成乙個仍按原序排列的序列。

例1、有乙個含有6個資料的公升序序列和乙個含有4個資料的公升序序列,將二者合併成乙個含有10個資料的公升序序列。

#define m 6

#define n 4

main()

,b[n]=;

int i,j,k,c[m+n];

i=j=k=0;

while(i

C語言常用演算法大全

1 非數值計算常用經典演算法 1 窮舉 也稱為 列舉法 即將可能出現的每一種情況一一測試,判斷是否滿足條件,一般採用迴圈來實現。例1 用窮舉法輸出所有的水仙花數 即這樣的三位正整數 其每位數字上的數字的立方和與該數相等,比如 13 53 33 153 法一 main 解析 此方法是將100到999所...

C語言常用演算法歸納

交換 累加 累乘 窮舉 排序 冒泡,選擇 查詢 順序即線性 級數計算 直接 簡接即遞推 一元非線性方程求根 牛頓迭代法 二分法 定積分計算 矩形法 梯形法 迭代 進製轉換 矩陣轉置 字元處理 統計 數字串 字母大小寫轉換 加密等 整數各數字上數字的獲取 輾轉相除法求最大公約數 最小公倍數 求最值 判...

C語言經典演算法詳解

分而治之方法與軟體設計的模組化方法非常相似。為了解決乙個大的問題,可以 1 把它分成兩個或多個更小的問題 2 分別解決每個小問題 3 把各小問題的解答組合起來,即可得到原問題的解答。小問題通常與原問題相似,可以遞迴地使用分而治之策略來解決。下列通過例項加以說明。例 利用分而治之演算法求乙個整數陣列中...