C語言常用演算法

2021-05-23 10:59:37 字數 4422 閱讀 8047

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

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

例:用隨機函式產生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<=10;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])

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語言常用演算法

收集一些語法 演算法方面的內容。用 顯示乙個菱形 posted 2010 06 21 09 09 齊心 閱讀 29 編輯 從鍵盤輸入乙個字串,將其中的大寫字母變小寫字母,小寫字母變大寫字母,並輸出 摘要 題目很簡單,但是要求用scanf函式逐個輸入字元儲存在字元陣列中,對於新手有一些難度。閱讀全文 ...

C語言常用演算法回顧

c語言三個數從小到大排序 輸出 任意輸入 3 個整數,程式設計實現對這 3 個整數由小到大進行排序。實現過程 1 定義資料型別,本例項中 a b c t 均為基本整型。2 使用輸入函式獲得任意 3 個值賦給 a b c。3 使用 if 語句進行條件判斷,如果 a 大於 b,則借助於中間變數 t 互換...

C語言常用演算法歸納

記錄一些常用的演算法,包括實際應用的。首先是氣泡排序。這個一般在一些濾波演算法的時候可能會用到。氣泡排序 include intmain 氣泡排序 for j 1 j n 1 j n個數處理n 1趟 for i 0 i n i return0 冒牌排序的演算法的基本思維是 1.對存放序列的陣列的第乙...