資訊保安系學生歸納的C語言經典演算法

2022-06-14 11:21:06 字數 3049 閱讀 8800

一、基本演算法:

交換、累加、累乘

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

窮舉、排序(冒泡,選擇)、查詢(順序即線性)

三、數值計算常用經典演算法:

級數計算(直接、簡接即遞推)、一元非線性方程求根(牛頓迭代法、二分法)、定積分計算(矩形法、梯形法)、矩陣轉置

四、其他:

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

一、基本演算法

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語言常用而經典的演算法

一 基本演算法交換 累加 累乘 二 非數值計算常用經典演算法窮舉 排序冒泡選擇 查詢順序即線性 三 數值計算常用經典演算法級數計算直接 簡接即遞推 一元非線性方程求根牛頓迭代法 二分法 定積分計算矩形法 梯形法 矩陣轉置 四 其他迭代 進製轉換 字元處理統計 數字串 字母大小寫轉換 加密等 整數各數...