一、基本演算法:
交換、累加、累乘
二、非數值計算常用經典演算法:
窮舉、排序(冒泡,選擇)、查詢(順序即線性)
三、數值計算常用經典演算法:
級數計算(直接、簡接即遞推)、一元非線性方程求根(牛頓迭代法、二分法)、定積分計算(矩形法、梯形法)、矩陣轉置
四、其他:
迭代、進製轉換、字元處理(統計、數字串、字母大小寫轉換、加密等)、整數各數字上數字的獲取、輾轉相除法求最大公約數(最小公倍數)、求最值、判斷素數(各種變形)、陣列元素的插入(刪除)、二維陣列的其他典型問題(方陣的特點、楊輝三角形)
一、基本演算法
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語言學生資訊管理系統
一.應用程式名稱 student.exe 二.應用程式的主題 設計目的 應用程式的主題是管理好學生成績,設計目的是進一步掌握和實踐c語言程式設計。三 應用程式簡介 1.基本結構 2.基本內容 編寫乙個成績管理程式。每個學生的資訊包含學生學號 姓名 性別和6門課程成績。1 學生資訊建立 順序儲存和鏈式...
超經典的C語言指標講解
pointer 1 a pointer 2 b if a printf a d,b d pointer 1,pointer 2 return 0 void swap int p1,int p2 子涵數中將p1指向的變數 a 與p2指向的變數 b 互換,即將a和b的值互換,也就是a中放的是9,b中放的...
C語言常用而經典的演算法
一 基本演算法交換 累加 累乘 二 非數值計算常用經典演算法窮舉 排序冒泡選擇 查詢順序即線性 三 數值計算常用經典演算法級數計算直接 簡接即遞推 一元非線性方程求根牛頓迭代法 二分法 定積分計算矩形法 梯形法 矩陣轉置 四 其他迭代 進製轉換 字元處理統計 數字串 字母大小寫轉換 加密等 整數各數...