C程式設計的常用演算法

2021-04-06 17:24:02 字數 4914 閱讀 5439

演算法(algorithm):計算機解題的基本思想方法和步驟.演算法的描述:是對要解決乙個問題或要完成一項任務所採取的方法和步驟的描述,包括需要什麼資料(輸入什麼資料、輸出什麼結果)、採用什麼結構、使用什麼語句以及如何安排這些語句等.通常使用自然語言、結構化流程圖、偽**等來描述演算法.

一、計數、求和、求階乘等簡單演算法

此類問題都要使用迴圈,要注意根據問題確定迴圈變數的初值、終值或結束條件,更要注意用來表示計數、和、階乘的變數的初值.

例:用隨機函式產生100個[0,99]範圍內的隨機整數,統計個位上的數字分別為1,2,3,4,5,6,7,8,9,0的數的個數並列印出來.

本題使用陣列來處理,用陣列a[100]存放產生的確100個隨機整數,陣列x[10]來存放個位上的數字分別為1,2,3,4,5,6,7,8,9,0的數的個數.即個位是1的個數存放在x[1]中,個位是2的個數存放在x[2]中,……個位是0的個數存放在x[10].

void main()

for(i = 1;i< = 100;i++)

} for(i = 1;i< = 100;i++)

x[p] = x[p]+1;

} for(i = 1;i< = 10;i++)

printf("%d,%d/n",p,x[i]);

} printf("/n");

} 二、求兩個整數的最大公約數、最小公倍數

分析:求最大公約數的演算法思想:(最小公倍數 = 兩個整數之積/最大公約數)

(1) 對於已知兩數m,n,使得m>n;

(2) m除以n得餘數r;

(3) 若r=0,則n為求得的最大公約數,演算法結束;否則執行(4);

(4) m←n,n←r,再重複執行(2).

例如: 求 m=14 ,n=6 的最大公約數. m n r

14 6 2

6  2 0

void main()

將其寫成一函式,若為素數返回1,不是則返回0

int prime(m%) }

main()

} 五、排序問題

1.選擇法排序(公升序)

基本思想:

1)對有n個數的序列(存放在陣列a(n)中),從中選出最小的數,與第1個數交換位置;

2)除第1 個數外,其餘n-1個數中選最小的數,與第2個數交換位置;

3)依次類推,選擇了n-1次後,這個數列已按公升序排列.

程式**如下:

void main()

printf("%d/n",a[i]);}}

2.冒泡法排序(公升序)

基本思想:(將相鄰兩個數比較,小的調到前頭)

1)有n個數(存放在陣列a(n)中),第一趟將每相鄰兩個數比較,小的調到前頭,經n-1次兩兩相鄰比較後,最大的數已「沉底」,放在最後乙個位置,小數上公升「浮起」;

2)第二趟對餘下的n-1個數(最大的數已「沉底」)按上法比較,經n-2次兩兩相鄰比較後得次大的數;

3)依次類推,n個數共進行n-1趟比較,在第j趟中要進行n-j次兩兩比較.

程式段如下

void main()

printf("the sorted numbers:/n");

for(i=0;i<10;i++)

printf("%d/n",a[i]);

} 3.合併法排序(將兩個有序陣列a、b合併成另乙個有序的陣列c,公升序)

基本思想:

1)先在a、b陣列中各取第乙個元素進行比較,將小的元素放入c陣列;

2)取小的元素所在陣列的下乙個元素與另一陣列中上次比較後較大的元素比較,重複上述比較過程,直到某個陣列被先排完;

3)將另乙個陣列剩餘元素抄入c陣列,合併排序完成.

程式段如下:

void main()

思考:將上面程式改寫一查詢函式find,若找到則返回下標值,找不到返回-1

基本思想:一列數放在陣列a[1]---a[n]中,待查詢的關鍵值為key,把key與a陣列中的元素從頭到尾一一進行比較查詢,若相同,查詢成功,若找不到,則查詢失敗.(查詢子過程如下.index:存放找到元素的下標.)

void main()

if(index==-1)

printf("the number is not found!/n");

else

printf("the number is found the no%d!/n",index);

} 2.折半查詢法(只能對有序數列進行查詢)

基本思想:設n個有序數(從小到大)存放在陣列a[1]----a[n]中,要查詢的數為x.用變數bot、top、mid 分別表示查詢資料範圍的底部(陣列下界)、頂部(陣列的上界)和中間,mid=(top+bot)/2

折半查詢的演算法如下:

(1) x=a(mid),則已找到退出迴圈,否則進行下面的判斷;

(2) xa(mid),x必定落在mid+1和top的範圍之內,即bot=mid+1;

(4) 在確定了新的查詢範圍後,重複進行以上比較,直到找到或者bot<=top.

將上面的演算法寫成如下程式:

void main()

main()

, x, i;

for(i=0;i八、矩陣(二維陣列)運算

(1)矩陣的加、減運算

c(i,j)=a(i,j)+b(i,j)加法

c(i,j)=a(i,j)-b(i,j)減法

(2)矩陣相乘

矩陣a有m*l個元素,矩陣b有l*n個元素,則矩陣c=a*b有m*n個元素).矩陣c中任一元素 (i=1,2,…,m;j=1,2,…,n)

#define m 2

#define l 4

#define n 3

void mv(int a[m][l], int b[l][n], int c[m][n]),,

};min(a);

} 九、迭代法

演算法思想:對於乙個問題的求解x,可由給定的乙個初值x0,根據某一迭代公式得到乙個新的值x1,這個新值x1比初值x0更接近要求的值x;再以新值作為初值,即:x1→x0,重新按原來的方法求x1,重複這一過和直到|x1-x0|<ε(某一給定的精度).此時可將x1作為問題的解.

例:用迭代法求某個數的平方根. 已知求平方根的迭代公式為:

#include

float fsqrt(float a)

while(fabs(x1-x0)>0.00001);

return(x1);

} main()

十、數制轉換

將乙個十進位制整數m轉換成 →r(2-16)進製字串.

方法:將m不斷除 r 取餘數,直到商為零,以反序得到結果.下面寫出一轉換函式,引數idec為十進位制數,ibase為要轉換成數的基(如二進位制的基是2,八進位制的基是8等),函式輸出結果是字串.

char *trdec(int idec, int ibase)

for(i=0;i十

一、字串的一般處理

1.簡單加密和解密

加密的思想是: 將每個字母c加(或減)一序數k,即用它後的第k個字母代替,變換式公式: c=c+k

例如序數k為5,這時 a→ f, a→f,b→?g… 當加序數後的字母超過z或z則 c=c+k -26

例如:you are good→ dtz fwj ltti

解密為加密的逆過程

將每個字母c減(或加)一序數k,即 c=c-k,

例如序數k為5,這時 z→u,z→u,y→t… 當加序數後的字母小於a或a則 c=c-k +26

下段程式是加密處理:

#include

char *jiami(char stri)

else if(stri[i]>=』a』&&stri[i]<=』z』)

else

ia=stri[i];

strp[i++]=ia;

}strp[i]=』/0』;

return(strp);

}main()

2.統計文字單詞的個數

輸入一行字元,統計其中有多少個單詞,單詞之間用格分隔開.

演算法思路:

(1)從文字(字串)的左邊開始,取出乙個字元;設邏輯量word表示所取字元是否是單詞內的字元,初值設為0

(2)若所取字元不是「空格」,「逗號」,「分號」或「感嘆號」等單詞的分隔符,再判斷word是否為1,若word不為1則表是新單詞的開始,讓單詞數num = num +1,讓word =1;

(3)若所取字元是「空格」,「逗號」,「分號」或「感嘆號」等單詞的分隔符, 則表示字元不是單詞內字元,讓word=0;

(4)再依次取下乙個字元,重得(2)(3)直到文字結束.

下面程式段是字串string中包含的單詞數

#include "stdio.h"

main()

printf("there are %d word in the line./n",num);}十

二、窮舉法

窮舉法(又稱「列舉法」)

基本思想是:一一枚舉各種可能的情況,並判斷哪一種可能是符合要求的解,這是一種「在沒有其它辦法的情況的方法」,是一種最「笨」的方法,然而對一些無法用解析法求解的問題往往能奏效,通常採用迴圈來處理窮舉問題.

例: 將一張面值為100元的人民幣等值換成100張5元、1元和0.5元的零鈔,要求每種零鈔不少於1張,問有哪幾種組合?

main() }

十三、遞迴演算法

用自身的結構來描述自身,稱遞迴

vb允許在乙個sub子過程和function過程的定義內部呼叫自己,即遞迴sub子過程和遞迴function函式.遞迴處理一般用棧來實現,每呼叫一次自身,把當前引數壓棧,直到遞迴結束條件;然後從棧中彈出當前引數,直到棧空.

遞迴條件:

(1)遞迴結束條件及結束時的值;

(2)能用遞迴形式表示,且遞迴向終止條件發展.

例:編fac(n)=n! 的遞迴函式

int fac(int n)

main()

C程式設計的常用演算法

演算法 algorithm 計算機解題的基本思想方法和步驟。演算法的描述 是對要解決乙個問題或要完成一項任務所採取的方法和步驟的描述,包括需要什麼資料 輸入什麼資料 輸出什麼結果 採用什麼結構 使用什麼語句以及如何安排這些語句等。通常使用自然語言 結構化流程圖 偽 等來描述演算法。一 計數 求和 求...

C 程式設計必備神器STL 常用演算法

原創 2017年05月07日 12 24 55 adjacent find 查詢兩個相鄰 adjacent 的等價 identical 元素 all of c 11 檢測在給定範圍中是否所有元素都滿足給定的條件 any of c 11 檢測在給定範圍中是否存在元素滿足給定條件 count 返回值等價...

C 提高程式設計 5 STL 常用演算法(查詢演算法)

5.2 常用查詢演算法 5.1 find includeusing namespace std include include include 常用查詢容器 find void test1 查詢容器中 是否有5 這個元素 vector iterator pos find v.begin v.end ...