交換、累加、累乘
窮舉、排序(冒泡,選擇)、查詢(順序即線性)
級數計算(直接、簡接即遞推)、一元非線性方程求根(牛頓迭代法、二分法)、定積分計算(矩形法、梯形法)
迭代、進製轉換、矩陣轉置、字元處理(統計、數字串、字母大小寫轉換、加密等)、整數各數字上數字的獲取、輾轉相除法求最大公約數(最小公倍數)、求最值、判斷素數(各種變形)、陣列元素的插入(刪除)、二維陣列的其他典型問題(方陣的特點、楊輝三角形)
例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);
}累加演算法的要領是形如「s=s+a」的累加式,此式必須出現在迴圈中才能被反覆執行,從而實現累加功能。「a」通常是有規律變化的表示式,s在進入迴圈前必須獲得合適的初值,通常為0。
例1、求1+2+3+……+100的和。
main()
printf("1+2+3+...+100=%d\n",s);
}【解析】程式中加粗部分為累加式的典型形式,賦值號左右都出現的變數稱為累加器,其中「i=i+1」為特殊的累加式,每次累加的值為1,這樣的累加器又稱為計數器。
累乘演算法的要領是形如「s=s*a」的累乘式,此式必須出現在迴圈中才能被反覆執行,從而實現累乘功能。「a」通常是有規律變化的表示式,s在進入迴圈前必須獲得合適的初值,通常為1。
例1、求10!
[分析] 10!=1×2×3×……×10
main()
printf("1*2*3*...*10=%ld\n",c);
}也稱為「列舉法」,即將可能出現的每一種情況一一測試,判斷是否滿足條件,一般採用迴圈來實現。
例1、用窮舉法輸出所有的水仙花數(即這樣的三位正整數:其每位數字上的數字的立方和與該數相等,比如:1*1*1+5*5*5+3*3*3=153)。
[法一]
main()
}【解析】此方法是將100到999所有的三位正整數一一考察,即將每乙個三位正整數的個位數、十位數、百位數一一求出(各數字上的數字的提取演算法見下面的「數字處理」),算出三者的立方和,一旦與原數相等就輸出。共考慮了900個三位正整數。
[法二]
main()
【解析】此方法是用1到9做百位數字、0到9做十位和個位數字,將組成的三位正整數與每一組的三個數的立方和進行比較,一旦相等就輸出。共考慮了900個組合(外迴圈單獨執行的次數為9,兩個內迴圈單獨執行的次數分別為10次,故if語句被執行的次數為9×10×10=900),即900個三位正整數。與法一判斷的次數一樣。
(1)氣泡排序(起泡排序)
假設要對含有n個數的序列進行公升序排列,氣泡排序演算法步驟是:
①從存放序列的陣列中的第乙個元素開始到最後乙個元素,依次對相鄰兩數進行比較,若前者大後者小,則交換兩數的位置;
②第①趟結束後,最大數就存放到陣列的最後乙個元素裡了,然後從第乙個元素開始到倒數第二個元素,依次對相鄰兩數進行比較,若前者大後者小,則交換兩數的位置;
③重複步驟①n-1趟,每趟比前一趟少比較一次,即可完成所求。
例1、任意讀入10個整數,將其用冒泡法按公升序排列後輸出。
#definen10
main()
for(i=0;i}
(2)選擇法排序
選擇法排序是相對好理解的排序演算法。假設要對含有n個數的序列進行公升序排列,演算法步驟是:
①從陣列存放的n個數中找出最小數的下標(演算法見下面的「求最值」),然後將最小數與第1個數交換位置;
②除第1個數以外,再從其餘n-1個數中找出最小數(即n個數中的次小數)的下標,將此數與第2個數交換位置;
③重複步驟①n-1趟,即可完成所求。
例1、任意讀入10個整數,將其用選擇法按公升序排列後輸出。
#definen10
main()
}for(i=0;i printf("%d\n",a[i]);
}(3)插入法排序
要想很好地掌握此演算法,先請了解「有序序列的插入演算法」,就是將某資料插入到乙個有序序列後,該序列仍然有序。插入演算法參見下面的「陣列元素的插入」。
例1、將任意讀入的整數x插入一公升序數列後,數列仍按公升序排列。
#definen10
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個整數,將其用插入法按降序排列後輸出。
(提示:將第2至第10個數一一有序插入到陣列a中)
#definen10
main()
}for(i=0;i}
(4)歸併排序
即將兩個都公升序(或降序)排列的資料序列合併成乙個仍按原序排列的序列。
C語言常用演算法大全
1 非數值計算常用經典演算法 1 窮舉 也稱為 列舉法 即將可能出現的每一種情況一一測試,判斷是否滿足條件,一般採用迴圈來實現。例1 用窮舉法輸出所有的水仙花數 即這樣的三位正整數 其每位數字上的數字的立方和與該數相等,比如 13 53 33 153 法一 main 解析 此方法是將100到999所...
C語言常用而經典的演算法
一 基本演算法交換 累加 累乘 二 非數值計算常用經典演算法窮舉 排序冒泡選擇 查詢順序即線性 三 數值計算常用經典演算法級數計算直接 簡接即遞推 一元非線性方程求根牛頓迭代法 二分法 定積分計算矩形法 梯形法 矩陣轉置 四 其他迭代 進製轉換 字元處理統計 數字串 字母大小寫轉換 加密等 整數各數...
資訊保安系學生歸納的C語言經典演算法
一 基本演算法 交換 累加 累乘 二 非數值計算常用經典演算法 窮舉 排序 冒泡,選擇 查詢 順序即線性 三 數值計算常用經典演算法 級數計算 直接 簡接即遞推 一元非線性方程求根 牛頓迭代法 二分法 定積分計算 矩形法 梯形法 矩陣轉置 四 其他 迭代 進製轉換 字元處理 統計 數字串 字母大小寫...