C語(yǔ)言算法基礎(chǔ).doc_第1頁(yè)
C語(yǔ)言算法基礎(chǔ).doc_第2頁(yè)
C語(yǔ)言算法基礎(chǔ).doc_第3頁(yè)
C語(yǔ)言算法基礎(chǔ).doc_第4頁(yè)
C語(yǔ)言算法基礎(chǔ).doc_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

精品C語(yǔ)言算法基礎(chǔ)2010-01-04 15:44:05 作者:dcedu 來(lái)源: 瀏覽次數(shù):30 網(wǎng)友評(píng)論 1 條 算法(Algorithm):計(jì)算機(jī)解題的基本思想方法和步驟。算法的描述:是對(duì)要解決一個(gè)問(wèn)題或要完成一項(xiàng)任務(wù)所采取的方法和步驟的描述,包括需要什么數(shù)據(jù)(輸入什么數(shù)據(jù)、輸出什么結(jié)果)、采算法(Algorithm):計(jì)算機(jī)解題的基本思想方法和步驟。算法的描述:是對(duì)要解決一個(gè)問(wèn)題或要完成一項(xiàng)任務(wù)所采取的方法和步驟的描述,包括需要什么數(shù)據(jù)(輸入什么數(shù)據(jù)、輸出什么結(jié)果)、采用什么結(jié)構(gòu)、使用什么語(yǔ)句以及如何安排這些語(yǔ)句等。通常使用自然語(yǔ)言、結(jié)構(gòu)化流程圖、偽代碼等來(lái)描述算法。 一、計(jì)數(shù)、求和、求階乘等簡(jiǎn)單算法 此類問(wèn)題都要使用循環(huán),要注意根據(jù)問(wèn)題確定循環(huán)變量的初值、終值或結(jié)束條件,更要注意用來(lái)表示計(jì)數(shù)、和、階乘的變量的初值。 例:用隨機(jī)函數(shù)產(chǎn)生100個(gè)0,99范圍內(nèi)的隨機(jī)整數(shù),統(tǒng)計(jì)個(gè)位上的數(shù)字分別為1,2,3,4,5,6,7,8,9,0的數(shù)的個(gè)數(shù)并打印出來(lái)。 本題使用數(shù)組來(lái)處理,用數(shù)組a100存放產(chǎn)生的確100個(gè)隨機(jī)整數(shù),數(shù)組x10來(lái)存放個(gè)位上的數(shù)字分別為1,2,3,4,5,6,7,8,9,0的數(shù)的個(gè)數(shù)。即個(gè)位是1的個(gè)數(shù)存放在x1中,個(gè)位是2的個(gè)數(shù)存放在x2中,個(gè)位是0的個(gè)數(shù)存放在x10。 void main() int a101,x11,i,p; for(i=0;i=11;i+) xi=0; for(i=1;i=100;i+) ai=rand() % 100; printf(%4d,ai); if(i%10=0)printf( ); for(i=1;i=100;i+) p=ai%10; if(p=0) p=10; xp=xp+1; for(i=1;in; (2) m除以n得余數(shù)r; (3) 若r=0,則n為求得的最大公約數(shù),算法結(jié)束;否則執(zhí)行(4); (4) mn,nr,再重復(fù)執(zhí)行(2)。 例如: 求 m=14 ,n=6 的最大公約數(shù). m n r 14 6 2 6 2 0 void main() int nm,r,n,m,t; printf(please input two numbers: ); scanf(%d,%d,&m,&n); nm=n*m; if (mn) t=n; n=m; m=t; r=m%n; while (r!=0) m=n; n=r; r=m%n; printf(最大公約數(shù):%d ,n); printf(最小公倍數(shù):%d ,nm/n); 三、判斷素?cái)?shù) 只能被1或本身整除的數(shù)稱為素?cái)?shù) 基本思想:把m作為被除數(shù),將2INT( )作為除數(shù),如果都除不盡,m就是素?cái)?shù),否則就不是。(可用以下程序段實(shí)現(xiàn)) void main() int m,i,k; printf(please input a number: ); scanf(%d,&m); k=sqrt(m); for(i=2;i=k) printf(該數(shù)是素?cái)?shù)); else printf(該數(shù)不是素?cái)?shù)); 將其寫(xiě)成一函數(shù),若為素?cái)?shù)返回1,不是則返回0 int prime( m%) int i,k; k=sqrt(m); for(i=2;ik;i+) if(m%i=0) return 0; return 1; 四、驗(yàn)證哥德巴赫猜想 (任意一個(gè)大于等于6的偶數(shù)都可以分解為兩個(gè)素?cái)?shù)之和) 基本思想:n為大于等于6的任一偶數(shù),可分解為n1和n2兩個(gè)數(shù),分別檢查n1和n2是否為素?cái)?shù),如都是,則為一組解。如n1不是素?cái)?shù),就不必再檢查n2是否素?cái)?shù)。先從n1=3開(kāi)始,檢驗(yàn)n1和n2(n2=N-n1)是否素?cái)?shù)。然后使n1+2 再檢驗(yàn)n1、n2是否素?cái)?shù), 直到n1=n/2為止。 利用上面的prime函數(shù),驗(yàn)證哥德巴赫猜想的程序代碼如下: #include math.h Page int prime(int m) int i,k; k=sqrt(m); for(i=2;i=k) return 1; else return 0; main() int x,i; printf(please input a even number(=6): ); scanf(%d,&x);if (x6|x%2!=0) printf(data error! ); else for(i=2;i=x/2;i+) if (prime(i)&prime(x-i) printf(%d+%d ,i,x-i); printf(驗(yàn)證成功!); break; 五、排序問(wèn)題 1選擇法排序(升序) 基本思想: 1)對(duì)有n個(gè)數(shù)的序列(存放在數(shù)組a(n)中),從中選出最小的數(shù),與第1個(gè)數(shù)交換位置; 2)除第1 個(gè)數(shù)外,其余n-1個(gè)數(shù)中選最小的數(shù),與第2個(gè)數(shù)交換位置; 3)依次類推,選擇了n-1次后,這個(gè)數(shù)列已按升序排列。 程序代碼如下: void main() int i,j,imin,s,a10; printf( input 10 numbers: ); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i9;i+) imin=i; for(j=i+1;jaj) imin=j; if(i!=imin) s=ai; ai=aimin; aimin=s; printf(%d ,ai); 2冒泡法排序(升序) 基本思想:(將相鄰兩個(gè)數(shù)比較,小的調(diào)到前頭) 1)有n個(gè)數(shù)(存放在數(shù)組a(n)中),第一趟將每相鄰兩個(gè)數(shù)比較,小的調(diào)到前頭,經(jīng)n-1次兩兩相鄰比較后,最大的數(shù)已“沉底”,放在最后一個(gè)位置,小數(shù)上升“浮起”; 2)第二趟對(duì)余下的n-1個(gè)數(shù)(最大的數(shù)已“沉底”)按上法比較,經(jīng)n-2次兩兩相鄰比較后得次大的數(shù); 3)依次類推,n個(gè)數(shù)共進(jìn)行n-1趟比較,在第j趟中要進(jìn)行n-j次兩兩比較。 程序段如下 void main() int a10; int i,j,t; printf(input 10 numbers ); for(i=0;i10;i+) scanf(%d,&ai); printf( ); for(j=0;j=8;j+) for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; printf(the sorted numbers: ); for(i=0;i10;i+) printf(%d ,ai); 3合并法排序(將兩個(gè)有序數(shù)組A、B合并成另一個(gè)有序的數(shù)組C,升序) 基本思想: 1)先在A、B數(shù)組中各取第一個(gè)元素進(jìn)行比較,將小的元素放入C數(shù)組; 2)取小的元素所在數(shù)組的下一個(gè)元素與另一數(shù)組中上次比較后較大的元素比較,重復(fù)上述比較過(guò)程,直到某個(gè)數(shù)組被先排完; 3)將另一個(gè)數(shù)組剩余元素抄入C數(shù)組,合并排序完成。 程序段如下: void main() int a10,b10,c20,i,ia,ib,ic; printf(please input the first array: ); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i10;i+) scanf(%d,&bi); printf( ); ia=0;ib=0;ic=0; while(ia10&ib10) if(aiabib) cic=aia;ia+; else cic=bib;ib+; ic+; while(ia=9) cic=aia; ia+;ic+; while(ib=9) Page cic=bib; b+;ic+; for(i=0;i20;i+) printf(%d ,ci); 六、查找問(wèn)題 1順序查找法(在一列數(shù)中查找某數(shù)x) 基本思想:一列數(shù)放在數(shù)組a1-an中,待查找的數(shù)放在x 中,把x與a數(shù)組中的元素從頭到尾一一進(jìn)行比較查找。用變量p表示a數(shù)組元素下標(biāo),p初值為1,使x與ap比較,如果x不等于ap,則使p=p+1,不斷重復(fù)這個(gè)過(guò)程;一旦x等于ap則退出循環(huán);另外,如果p大于數(shù)組長(zhǎng)度,循環(huán)也應(yīng)該停止。(這個(gè)過(guò)程可由下語(yǔ)句實(shí)現(xiàn)) void main() int a10,p,x,i;printf(please input the array: ); for(i=0;i10;i+) scanf(%d,&ai); printf(please input the number you want find: ); scanf(%d,&x); printf( ); p=0; while(x!=ap&p=10) printf(the number is not found! ); else printf(the number is found the no%d! ,p); 思考:將上面程序改寫(xiě)一查找函數(shù)Find,若找到則返回下標(biāo)值,找不到返回-1 基本思想:一列數(shù)放在數(shù)組a1-an中,待查找的關(guān)鍵值為key,把key與a數(shù)組中的元素從頭到尾一一進(jìn)行比較查找,若相同,查找成功,若找不到,則查找失敗。(查找子過(guò)程如下。index:存放找到元素的下標(biāo)。) void main() int a10,index,x,i; printf(please input the array: ); for(i=0;i10;i+) scanf(%d,&ai); printf(please input the number you want find: ); scanf(%d,&x); printf( ); index=-1; for(i=0;i10;i+) if(x=ai) index=i; break; if(index=-1) printf(the number is not found! ); else printf(the number is found the no%d! ,index); 2折半查找法(只能對(duì)有序數(shù)列進(jìn)行查找) 基本思想:設(shè)n個(gè)有序數(shù)(從小到大)存放在數(shù)組a1-an中,要查找的數(shù)為x。用變量bot、top、mid 分別表示查找數(shù)據(jù)范圍的底部(數(shù)組下界)、頂部(數(shù)組的上界)和中間,mid=(top+bot)/2,折半查找的算法如下: (1)x=a(mid),則已找到退出循環(huán),否則進(jìn)行下面的判斷; (2)xa(mid),x必定落在mid+1和top的范圍之內(nèi),即bot=mid+1;(4)在確定了新的查找范圍后,重復(fù)進(jìn)行以上比較,直到找到或者bot=top。 將上面的算法寫(xiě)成如下程序: void main() int a10,mid,bot,top,x,i,find; printf(please input the array: ); for(i=0;i10;i+) scanf(%d,&ai); printf(please input the number you want find: ); scanf(%d,&x); printf( ); bot=0;top=9;find=0; while(bottop&find=0) mid=(top+bot)/2; Page if(x=amid) find=1;break; else if(xap&pp; i-) ai=ai-1; ap=x; main() int aN+1=1,3,4,7,8,11,13,18,56,78, x, i; for(i=0; iN; i+) printf(%d, ai); printf( Input x:); scanf(%d, &x); insert(a, x); for(i=0; i=N; i+) printf(%d, ai);printf( ); 八、矩陣(二維數(shù)組)運(yùn)算 (1)矩陣的加、減運(yùn)算 C(i,j)=a(i,j)+b(i,j) 加法 C(i,j)=a(i,j)-b(i,j) 減法 (2)矩陣相乘 (矩陣A有M*L個(gè)元素,矩陣B有L*N個(gè)元素,則矩陣C=A*B有M*N個(gè)元素)。矩陣C中任一元素 (i=1,2,m; j=1,2,n) #define M 2 #define L 4 #define N 3void mv(int aML, int bLN, int cMN) int i, j, k; for(i=0; iM; i+) for(j=0; jN; j+) cij=0; for(k=0; kL; k+) cij+=aik*bkj; main() int aML=1,2,3,4,1,1,1,1; int bLN=1,1,1,1,2,1,2,2,1,2,3,1, cMN; int i, j; mv(a,b,c); for(i=0; iM; i+) for(j=0; jN; j+) printf(%4d, cij); printf( ); (3)矩陣傳置 例:有二維數(shù)組a(5,5),要對(duì)它實(shí)現(xiàn)轉(zhuǎn)置,可用下面兩種方式: #define N 3 void ch1(int aNN) int i, j, t; for(i=0; iN; i+) for(j=i+1; jN; j+) t=aij; aij=aji; aji=t; void ch2(int aNN) int i, j, t; for(i=1; iN; i+) for(j= 0; ji; j+) t=aij; aij=aji; aji=t; main() int aNN=1,2,3,4,5,6,7,8,9, i, j; ch1(a); /*或ch2(a);*/ for(i=0; iN; i+) for(j=0; jN; j+) printf(%4d, aij); printf( ); (4)求二維數(shù)組中最小元素及其所在的行和列 基本思路同一維數(shù)組,可用下面程序段實(shí)現(xiàn)(以二維數(shù)組a34為例): Page 變量max中存放最大值,row,column存放最大值所在行列號(hào) #define N 4 #define M 3 void min(int aMN) int min, row, column, i, j; min=a00; row=0; column=0; for(i=0; iM; i+) for(j=0; jN; j+) if(aijmin) min=aij; row=i; column=j; printf(Min=%d At Row%d,Column%d , min, row, column); main() int aMN=1,23,45,-5,5,6,-7,6,0,33,8,15; min(a); 九、迭代法 算法思想:對(duì)于一個(gè)問(wèn)題的求解x,可由給定的一個(gè)初值x0,根據(jù)某一迭代公式得到一個(gè)新的值x1,這個(gè)新值x1比初值x0更接近要求的值x;再以新值作為初值,即:x1x0,重新按原來(lái)的方法求x1,重復(fù)這一過(guò)和直到|x1-x0|(某一給定的精度)。此時(shí)可將x1作為問(wèn)題的解。 例:用迭代法求某個(gè)數(shù)的平方根。 已知求平方根的迭代公式為: #include float fsqrt(float a) float x0, x1; x1=a/2; do x0=x1; x1=0.5*(x0+a/x0); while(fabs(x1-x0)0.00001); return(x1); main(); float a; scanf(%f, &a); printf(genhao =%f , fsqrt(a); 十、數(shù)制轉(zhuǎn)換 將一個(gè)十進(jìn)制整數(shù)m轉(zhuǎn)換成 r(216)進(jìn)制字符串。 方法:將m不斷除 r 取余數(shù),直到商為零,以反序得到結(jié)果。下面寫(xiě)出一轉(zhuǎn)換函數(shù),參數(shù)idec為十進(jìn)制數(shù),ibase為要轉(zhuǎn)換成數(shù)的基(如二進(jìn)制的基是2,八進(jìn)制的基是8等),函數(shù)輸出結(jié)果是字符串。 char *trdec(int idec, int ibase) char strdr20, t; int i, idr, p=0; while(idec!=0) idr=idec % ibase; if(idr=10) strdrp+=idr-10+65; else strdrp+=idr+48; idec/=ibase; for(i=0; ip/2; i+) t=strdri; strdri=strdrp-i-1; strdrp-i-1=t; strdrp=0; return(strdr); main() int x, d; scanf(%d%d, &x, &d); printf(%s , trdec(x,d); 十一、字符串的一般處理 1簡(jiǎn)單加密和解密 加密的思想是: 將每個(gè)字母C加(或減)一序數(shù)K,即用它后的第K個(gè)字母代替,變換式公式: c=c+k 例如序數(shù)k為5,這時(shí) A F, af,B?G 當(dāng)加序數(shù)后的字母超過(guò)Z或z則 c=c+k -26 例如:You are good Dtz fwj ltti 解密為加密的逆過(guò)程 將每個(gè)字母C減(或加)一序數(shù)K,即 c=c-k, 例如序數(shù)k為5,這時(shí) ZU,zu,YT 當(dāng)加序數(shù)后的字母小于A或a則 c=c-k +26 下段程序是加密處理: #include char *jiami(char stri) int i=0; char strp50,ia; while(strii!=0) if(strii=A&striiZ) ia-=26; else if(strii=a&striiz) ia-=26; else ia=strii; strpi+=ia; strpi=0; return(strp); main() char s50; gets(s); printf(%s , jiami(s); 2統(tǒng)計(jì)文本單詞的個(gè)數(shù) 輸入一行字符,統(tǒng)計(jì)其中有多少個(gè)單詞,單詞之間用格分隔開(kāi)。 算法思路: (1)從文本(字符串)的左邊開(kāi)始,取出一個(gè)字符;設(shè)邏輯量word表示所取字符是否是單詞內(nèi)的字符,初值設(shè)為0 (2)若所取字符不是“空格”,“逗號(hào)”,“分號(hào)”或“感嘆號(hào)”等單詞的分隔符,再判斷word是否為1,若word不為1則表是新單詞的開(kāi)始,讓單詞數(shù)num = num +1,讓word =1; (3)若所取字符是“空格”,“逗號(hào)”,“分號(hào)”或“感嘆號(hào)”等單詞的分隔符, 則表示字符不是單詞內(nèi)字符,讓word=0; (4) 再依次取下一個(gè)字符,重得(2)(3)直到文本結(jié)束。 下面程序段是字符串string中包含的單詞數(shù) #include stdio.h m

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論