C語(yǔ)言常見(jiàn)算法_第1頁(yè)
C語(yǔ)言常見(jiàn)算法_第2頁(yè)
C語(yǔ)言常見(jiàn)算法_第3頁(yè)
C語(yǔ)言常見(jiàn)算法_第4頁(yè)
C語(yǔ)言常見(jiàn)算法_第5頁(yè)
已閱讀5頁(yè),還剩36頁(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)介

會(huì)計(jì)學(xué)1C語(yǔ)言常見(jiàn)算法(2)隨機(jī)數(shù)函數(shù)random(intnum)用于產(chǎn)生[0,num)區(qū)間的一個(gè)整數(shù)。其包含在“stdlib.h”頭文件中為了使每一次運(yùn)行都產(chǎn)生一組新的隨機(jī)數(shù),可以使用randomize()函數(shù)是每次均產(chǎn)生不同的隨機(jī)數(shù)。其包含在頭文件“time.h”中(3)最大值與最小值我們需要將最大值(或最小值)保存在一個(gè)變量中(假設(shè)設(shè)變量名為max和min),變量的初值我們一般設(shè)為數(shù)列中的第一個(gè)值。第1頁(yè)/共41頁(yè)例2:產(chǎn)生20個(gè)50到200之間的隨機(jī)整數(shù),并求出其中的素?cái)?shù)、最大值和最小值。#include"stdlib.h"#include"time.h"main(){inta[20],b[20],max,min,k,i,j=0;

randomize();for(i=0;i<20;i++)a[i]=random(151)+50;產(chǎn)生20個(gè)[50,200]區(qū)間內(nèi)的隨機(jī)數(shù)第2頁(yè)/共41頁(yè)for(i=0;i<20;i++){for(k=2;k<a[i];k++)if(a[i]%k==0)break;

if(k==a[i]){b[j]=a[i];j++;}}for(i=0;i<j;i++)printf("%4d",b[i]);printf("\n");從a數(shù)組中找出其中的素?cái)?shù)放在b數(shù)組中輸出b數(shù)組中的各個(gè)元素

max=a[0];min=a[0];for(i=1;i<20;i++){if(a[i]>max)max=a[i];if(a[i]<min)min=a[i];}printf("max=%4d,min=%4d\n",max,min);}求出a數(shù)組中的最大值與最小值第3頁(yè)/共41頁(yè)二、求累加和的算法1循環(huán)條件次數(shù)控制(加多少項(xiàng)n,20,100)

用誤差控制(直到某一項(xiàng)小于或大于一個(gè)數(shù))使用終止標(biāo)記2循環(huán)體求和求每一項(xiàng):從前一項(xiàng)求出后一項(xiàng)、單獨(dú)求每一項(xiàng)為下一項(xiàng)作準(zhǔn)備3循環(huán)初值:設(shè)為0、設(shè)為第一項(xiàng)注意雙重循環(huán)設(shè)初值的位置第4頁(yè)/共41頁(yè)4-16有一分?jǐn)?shù)序列

的前20項(xiàng)之和main(){inti;floatf1=1,f2=1,f3,s=0;for(i=1;i<=20;i++){

f3=f1+f2;f1=f2;f2=f3;s=s+f2/f1;}printf("s=%f\n",s);}intf1,f2……s=s+1.0*f2/f1s=s+(float)f2/f1第5頁(yè)/共41頁(yè)三、迭代問(wèn)題

這種方法是使用某個(gè)公式反復(fù)校正根的近似值,使之逐步精確化,最后得到滿足精度要求的結(jié)果。第6頁(yè)/共41頁(yè)例:用牛頓迭代法求方程在1.5附近的根(精度為10-5)

2x3-4x2+3x-6=0

迭代公式為:x=x0-f/f1(f1為方程的導(dǎo)數(shù)公式)#include"math.h"main(){floatx,x0,f,f1;x0=1.5;f=((2*x0-4)*x0+3)*x0-6;f1=(6*x0-8)*x0+3;x=x0-f/f1;第7頁(yè)/共41頁(yè)while(fabs(x-x0)>=1e-5)

{

x0=x;f=((2*x0-4)*x0+3)*x0-6;f1=(6*x0-8)*x0+3;x=x0-f/f1;}

printf("%10.8f\n",x);}第8頁(yè)/共41頁(yè)四、數(shù)字分離

有些題中經(jīng)常要求將一個(gè)數(shù)中的每一位數(shù)字或者其中的某些位數(shù)字輸出,就需要使用到數(shù)字分離技術(shù)。如在求解同構(gòu)數(shù)等問(wèn)題時(shí)都需要使用到數(shù)字分離技術(shù)第9頁(yè)/共41頁(yè)例:給出一個(gè)不多于4位的正整數(shù),要求:求出它是幾位數(shù),并且按逆序打印出各位數(shù)字main(){inti,j,k=0;scanf("%d",&i);while(i!=0)

{printf("%4d",i%10);i=i/10;k++;

}printf("\nk=%d\n",k);}第10頁(yè)/共41頁(yè)四、以特殊字符做為終止標(biāo)志例:統(tǒng)計(jì)從鍵盤(pán)輸入字符的個(gè)數(shù),以'#'結(jié)束。#include"stdio.h"main(){charc;inti;c=getchar();for(i=0;c!='#';i++)c=getchar();printf("thenumberis:%d",i);}第11頁(yè)/共41頁(yè)五、排序問(wèn)題常用的排序方法有四種:順序交換法、選擇法、冒泡法、插入法a.順序排序法(n=10)指導(dǎo)思想:先設(shè)定a[0]中存放最小值,然后用a[0]分別與其后的每一個(gè)數(shù)a[j](j=1..9)進(jìn)行比較,在比較過(guò)程中如果發(fā)現(xiàn)有比a[0]小的數(shù),就將a[0]與a[j]互換,一遍掃描之后,a[0]就是10個(gè)數(shù)中最小的數(shù),重復(fù)此算法,只是每次比較時(shí),進(jìn)行比較的數(shù)的范圍向后移一個(gè)位置。反復(fù)執(zhí)行(n-1)次上述操作第12頁(yè)/共41頁(yè)例1:將數(shù)組a中的10個(gè)數(shù)按照由大到小的順序排好(使用順序交換法)#defineN10main(){inta[N],i,j,k,t;for(i=0;i<N;i++)scanf("%d",&a[i]);

for(i=0;i<N-1;i++)for(j=i+1;j<N;j++)if(a[j]<a[i]){t=a[j];a[j]=a[i];a[i]=t;}for(i=0;i<N;i++)printf("%5d",a[i]);}第13頁(yè)/共41頁(yè)b.選擇排序法

指導(dǎo)思想:不急于交換,先找出a[0]到a[9]中的最小數(shù)所在的位置k,一遍掃描完之后,在把a(bǔ)[0]與a[k]進(jìn)行交換,重復(fù)次算法9次。例2:將數(shù)組a中的10個(gè)數(shù)按照由大到小的順序排好(使用選擇法)第14頁(yè)/共41頁(yè)#defineN10main(){inta[N],i,j,k,t;for(i=0;i<N;i++)scanf("%d",&a[i]);

for(i=0;i<N-1;i++){k=i;for(j=i+1;j<N;j++)if(a[j]<a[k])k=j;t=a[i];a[i]=a[k];a[k]=t;}for(i=0;i<N;i++)printf("%5d",a[i]);}第15頁(yè)/共41頁(yè)c.冒泡法指導(dǎo)思想:是將相鄰的兩個(gè)數(shù)進(jìn)行比較,若前一個(gè)數(shù)比后一個(gè)數(shù)大,在交換兩元素的內(nèi)容,否則不交換。從而把最大的數(shù)放在最后位置。第16頁(yè)/共41頁(yè)#defineN10main(){inta[N],i,j,k,t;for(i=0;i<N;i++)scanf("%d",&a[i]);

for(i=0;i<N-1;i++)for(j=0;j<N-i-1;j++)if(a[j+1]<a[j]){t=a[j];a[j]=a[j+1];a[j+1]=t;}for(i=0;i<N;i++)printf("%5d",a[i]);}第17頁(yè)/共41頁(yè)例:有N個(gè)數(shù)已按由小到大的順序排好,要求輸入一個(gè)數(shù),把它插入到原有序列中,而且仍然保持有序。輸入數(shù)據(jù)時(shí),使其數(shù)據(jù)排列仍然有序解題思想:先找到待插入的位置,然后將從該位置起到數(shù)組的最后位置的所有元素均向后移一個(gè)位置。第18頁(yè)/共41頁(yè)

main(){inta[100],i,j,n,x;scanf("%d",&n);/*確定數(shù)組元素中的個(gè)數(shù)*/for(i=0;i<n;i++)scanf("%d",&a[i]);/*給數(shù)組的每個(gè)元素賦初值*/scanf("%d",&x);/*輸入待插入的數(shù)據(jù)*/for(i=0;i<n;i++)if(a[i]>x)break;/*找到待插入的位置i*/for(j=n-1;j>=i;j--)a[j+1]=a[j];/*從a[i]到a[n-1]之間的數(shù)組軍后移一位*/a[i]=x;/*把數(shù)據(jù)x放到a[i]位置處*/for(i=0;i<=n;i++)printf("%5d",a[i]);printf("\n");}第19頁(yè)/共41頁(yè) main() {intx[50],y,n,i; scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&x[i]);printf("%5d",x[i]);}printf("\n"); for(i=0;i<=(n-1)/2;i++) {y=x[i]; x[i]=x[n-1-i]; x[n-1-i]=y;} for(i=0;i<n;i++) printf("%5d",x[i]); printf("\n"); }方法1:例6.將n(n<=50)個(gè)整數(shù)按逆序重放在數(shù)組中。第20頁(yè)/共41頁(yè) main() {intx[100],n,m,i,j; scanf("%d",&n); for(i=0;i<n;i++)scanf("%d",&x[i]); for(j=1;j<=n;j++){m=x[0]; for(i=0;i<n-j;i++)x[i]=x[i+1]; x[n-j]=m; } for(i=0;i<n;i++) printf("%5d",x[i]); printf("\n"); }方法2第21頁(yè)/共41頁(yè)注意:求解水仙花數(shù)、完數(shù)、同構(gòu)數(shù)、最大公約數(shù)和最小公倍數(shù)以及費(fèi)波拉切數(shù)列等內(nèi)容水仙花數(shù):是一個(gè)三位數(shù),其各位數(shù)字的立方和等于該數(shù)本身。如:153=13+53+33完數(shù):一個(gè)數(shù)等于它的所有因子(不包括它本身)之和。如:6=1+2+3同構(gòu)數(shù):一個(gè)數(shù)等于它的平方數(shù)的右端。如5的平方是25最大公約數(shù):使用輾轉(zhuǎn)相除法進(jìn)行求解第22頁(yè)/共41頁(yè)圖形1:(法一)main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=5;j++)printf(“*”);printf(“\n”);}}*************************六、簡(jiǎn)單圖形打印第23頁(yè)/共41頁(yè)圖形1:(法二)main(){inti;for(i=1;i<=5;i++)printf(“*****\n”);}*************************第24頁(yè)/共41頁(yè)圖形2:(法一)main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<i;j++)printf(““);for(j=1;j<=5;j++)printf(“*”);printf(“\n”);}}*************************第25頁(yè)/共41頁(yè)圖形2:(法二)main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<i;j++)printf(““);printf(“*****\n”);}}*************************第26頁(yè)/共41頁(yè)圖形3:main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=5-i:j++)printf(““);for(j=1;j<=5;j++)printf(“*”);printf(“\n”);}}*************************第27頁(yè)/共41頁(yè)圖形4:main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=i;j++)printf(“*”);printf(“\n”);}}***************第28頁(yè)/共41頁(yè)圖形5:main(){inti,j;for(i=1;i<=5;i++){for(j=1;j<=5-i;j++)printf(““);for(j=1;j<=i;j++)printf(“*”);printf(“\n”);}}***************第29頁(yè)/共41頁(yè)*************************圖形6:main(){inti,j,k;for(i=1;i<=4;i++){for(j=1;j<=4-i;j++)printf("");for(k=1;k<=2*i-1;k++)printf("*");printf("\n");}

for(i=1;i<=3;i++){for(j=1;j<=i;j++)printf("");for(k=1;k<=7-2*i;k++)printf("*");printf("\n");}}第30頁(yè)/共41頁(yè)七、字符數(shù)組

在這一部分里要注意字符串的正確的輸入、輸出格式。一般我們使用'\0'做為循環(huán)終止的條件,如想用長(zhǎng)度做為終止條件,則該長(zhǎng)度應(yīng)為字符串的實(shí)際長(zhǎng)度,而不應(yīng)用定義字符數(shù)組時(shí)聲明的長(zhǎng)度

注意:字符串的排序、連接問(wèn)題(5-13、5-16)第31頁(yè)/共41頁(yè)練習(xí)1、在一個(gè)字符串中刪除一個(gè)指定的字符。1、找到要?jiǎng)h除字符的位置,將其后面的字符依次往前移一個(gè)位置。2、利用產(chǎn)生一個(gè)新數(shù)組的方法,對(duì)原串中的不等于指定的字符的字符放到新數(shù)組中。第32頁(yè)/共41頁(yè)#include"stdio.h"main(){charstr[80],c;inti,j;gets(str);c=getchar();j=0;for(i=0;str[i]!='\0';i++)if(str[i]!=c){str[j]=str[i];j++;}str[j]='\0';puts(str);}#include"stdio.h"main(){charstr[80],c;inti,j,k;gets(str);c=getchar();for(i=strlen(str)-1;i>=0;i--)if(str[i]==c){for(k=i;str[k]!='\0';k++)str[k]=str[k+1];str[k]='\0';}puts(str);}第33頁(yè)/共41頁(yè)練習(xí)2、編寫(xiě)程序,比較兩個(gè)字符串的大小。(不能使用strcmp()函數(shù))比較規(guī)則:逐個(gè)字符進(jìn)行比較,直到有兩個(gè)字符不等或有一個(gè)字符串結(jié)束為止。第34頁(yè)/共41頁(yè)main(){chars1[80],s2[80];inti,k;gets(s1);gets(s2);i=0;while(s1[i]!='\0'&&s2[i]!='\0')

if(s1[i]!=s2[i])break;elsei++;

k=s1[i]-s2[i];if(k>0)printf("s1>s2\n");elseif(k<0)printf("s1<s2\n");elseprintf("s1=s2\n");}第35頁(yè)/共41頁(yè)

main(){chars1[80],s2[80];inti,k;gets(s1);gets(s2);i=0;while(s1[i]==s2[i]&&s1[i]!='\0'&&s2[i]!='\0')i++;k=s1[i]-s2[i];if(k>0)printf("s1>s2\n");elseif(k<0)printf("s1<s2\n");elseprintf("s1=s2\n");}第36頁(yè)/共41頁(yè)練習(xí)3、判斷一字符串是否為另一個(gè)字符串的子串,若是則返回第一出現(xiàn)的起始位置,否則則返回0main(){staticchars1[20]="IloveChina!";staticchars2[20]="love";inti,j,k,m=0;for(i=0;s1[i]!='\0';i++)

if(s1[i]==s2[0])

{for(j=1,k=i+1;s2[j]!='\0';j++,k++)if(s1[k]!=s2[j])break;if(s2[j]=='\0'){m=i;break;}

}printf("stationis%d\n",m);}第37頁(yè)/共41頁(yè)八、對(duì)矩陣的操作注意:矩陣的主對(duì)角線、副對(duì)角線的概念如何實(shí)現(xiàn)矩陣轉(zhuǎn)置、求解矩陣中指定的元素之和等問(wèn)題(如求解右上三角、左下三角的元素之和)打印楊輝三角形(用一維和二維分別實(shí)現(xiàn))第38頁(yè)/共41頁(yè)習(xí)題7.6:輸出楊輝三角形(10行)。vo

溫馨提示

  • 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)論