常見編程算法實(shí)例_第1頁
常見編程算法實(shí)例_第2頁
常見編程算法實(shí)例_第3頁
常見編程算法實(shí)例_第4頁
常見編程算法實(shí)例_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、常見編程算法實(shí)例關(guān)于數(shù)字上的一些編程算法1. 輸出 9*9 口訣乘法表分析:分行與列考慮,共9行9列,i控制行,j控制列。#include "stdio.h"main() int i,j,result; printf("n");for (i=1;i<10;i+) for(j=1;j<=i;j+) result=i*j; printf("%d*%d=%-3d",i,j,result);/*-3d 表示左對(duì)齊,占 3 位 */ printf("n");/* 每一行后換行 */2.求 s=a+aa+aaa+a

2、aaa+aa.a的值,其中 a 是一個(gè)數(shù)字。例如 2+22+222+2222+22222(此時(shí)共有5 個(gè)數(shù)相加 ),幾個(gè)數(shù)相加有鍵盤控制。 【分析】關(guān)鍵是計(jì)算出每一項(xiàng)的值。main() int a,n,count=1; long int sn=0,tn=0; printf("please input a and nn"); scanf("%d,%d",&a,&n); printf("a=%d,n=%dn",a,n); while(count<=n) tn=tn+a;sn=sn+tn;a=a*10; +count;

3、printf("a+aa+.=%ldn",sn);公式口 /4=1-1/3+1/5-1/7+.+ 1/n ,求口的近似值,直到最后一項(xiàng)1/n的絕對(duì)值小于 0.000001。 #include<stdio.h>#include<math.h>main() int f=1;double pi=0,t=1,v=1; while(fabs(t)>1e-6) pi=pi+t;v+=2;f=-f; t=f/v;pi*=4;printf(” n =%fn",pi);有一分?jǐn)?shù)序列: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13.求出

4、這個(gè)數(shù)列的前 20項(xiàng)之和。規(guī)律 :分子是前一項(xiàng)分子分母之和,分母是前一項(xiàng)的分子。main() int n,t,number=20;float a=2,b=1,s=0;for(n=1;n<=number;n+)s=s+a/b;t=a;a=a+b;b=t;/* 序列規(guī)律的實(shí)現(xiàn) */printf("sum is %9.6fn",s); 判斷 11<=x<=10000 中的數(shù)那些是回文數(shù) ,統(tǒng)計(jì)回文數(shù)個(gè)數(shù), 回文數(shù)每行輸出 10 個(gè)。分析: (1) 讓 x 重新構(gòu)成新的數(shù) t, 如果 x=t 則是回文數(shù) .(2) 分解出 x 的各位,進(jìn)行首尾比較,如果都 相等則是

5、回文數(shù)。fun1()/ 算法一 long x,i,t=0,s=10,cnt=0;for(x=11;x<10000;x+) i=x;while(i!=0)/ 構(gòu)成新的數(shù) t=t*s+i%10;i=i/10; if(t=x)printf("%5d",x);cnt+;if(cnt%10=0) printf("n"); t=0; printf("ncnt=%5d",cnt);fun2()/ 算法二 long x,i,t=0,j=0,s=10,x1,cnt=0;int a10;for(x=11;x<10000;x+) x1=x;wh

6、ile(x1!=0)/ 分解出各位 a j =x1%10;x1=x1/10;j+; i=0;j-;while(i<j)/ 首尾比較if(ai=aj)i+,j-;else break;if(i>=j)printf("%5d",x);cnt+;if(cnt%10=0) printf("n"); j=0; printf("ncnt=%5d",cnt); main()fun1(); 求 1+2!+3!+.+20! 的和。main()float n,s=0,t=1;for(n=1;n<=20;n+) t*=n; / 實(shí)現(xiàn)階乘s

7、+=t; / 將階乘累加printf("1+2!+3!.+20!=%en",s);/%e 為科學(xué)計(jì)數(shù)法輸出輸入一個(gè)年份判斷它是否是閏年,滿足下面條件之一就稱為閏年:(1) .能被 4 整除而不能被100 整除。(2).能被 100 整除也能被 400 整除。#include<stdio.h>main()long int year;printf("input year:");scanf("%d",&year);if(year%4=0&& year%100!=0|year%100=0&&

8、year%400=0) printf("yes");else printf("No"); 將十進(jìn)制數(shù)轉(zhuǎn)換成任意進(jìn)制。#include<stdio.h>分析:將輸入的數(shù)循環(huán)除以基數(shù)取余直到商為0 ,然后逆序輸出。void main() / idec 為十進(jìn)制數(shù), ibase 為要轉(zhuǎn)換成數(shù)的基int idec,i, idr, p=0,ibase;char strdr20,t;printf(" 輸入要轉(zhuǎn)換的十進(jìn)制數(shù) idec="); scanf("%d",&idec);printf("n 輸

9、入要轉(zhuǎn)換成的進(jìn)制基數(shù) (如 :八進(jìn)制 則輸入 8)ibase=");scanf("%d",&ibase);while(idec!=0) idr=idec % ibase;/ 循環(huán)除以基數(shù)取余 直到商為 0if(idr>=10) strdrp+=idr-10+65; else strdrp+=idr+48; idec/=ibase;/ 將 16 進(jìn)制的 10,11,12,13,14,15 與 A,B,C,D,E,F 對(duì)應(yīng) /將數(shù)字轉(zhuǎn)換為數(shù)字字符/ 得到商 ,把這個(gè)商的值重新賦值給 idec/ 下面 for 循環(huán)的目的是將取余的各數(shù)逆序存放for(i=0

10、; i<p/2; i+) t=strdri;strdri=strdrp-i-1;strdrp-i-1=t; strdrp='0'printf("n 轉(zhuǎn)換成 %d 進(jìn)制后的數(shù)為 :%s",ibase,strdr); printf("n"); 將一個(gè)數(shù)組逆序輸出。分析:用第一個(gè)與最后一個(gè)交換,然后用第二個(gè)與倒數(shù)第二個(gè)交換,其余依此類推。#define N 5main()int aN=9,6,5,4,1,i,temp;printf("n original array:n");for(i=0;i<N;i+)prin

11、tf("%4d",ai);for(i=0;i<N/2;i+)temp=ai;ai=aN-i-1;aN-i-1=temp; printf("n sorted array:n");for(i=0;i<N;i+)printf("%4d",ai); 打印出所有的 "水仙花數(shù) ",所謂 "水仙花數(shù) "是指一個(gè)三位數(shù), 其各位數(shù)字立方和等于該數(shù)本身。 例如: 153 是一個(gè) " 水仙花數(shù) ",因?yàn)?153=1 的三次方 5 的三次方 3 的三次方。分析:利用 for 循環(huán)控制

12、 100-999 個(gè)數(shù),每個(gè)數(shù)分解出個(gè)位,十位,百位。main()int i,j,k,n; printf("'water flower'number is:");for(n=100;n<1000;n+) i=n/100;/* 分解出百位 */ j=n/10%10;/* 分解出十位 */ k=n%10;/* 分解出個(gè)位 */ if(i*100+j*10+k=i*i*i+j*j*j+k*k*k) printf("%-5d",n); printf("n"); 找出 3-1000 中的全部素?cái)?shù)。 素?cái)?shù)(質(zhì)數(shù)):只能被 1

13、 和自身整除的自然數(shù) (1除外).如 2 3 5 7是素 數(shù)。#include<stdio.h>#include<math.h>main()int i,j,cnt=0;for(i=3;i<=1000;i+) for(j=2;j<=sqrt(i);j+)/i 能被 j 整除說明不是素?cái)?shù),數(shù)學(xué)上已經(jīng)證明只需要判斷 if(i%j=0) break; / j<=sqrt ( i), i 都不能被 j 整除就能證明 i 為素?cái)?shù)。 if(j>sqrt(i) printf("%4d",i);cnt+; if(cnt%5=0) printf(

14、"n");/控制每行輸出 5 個(gè)數(shù) 判斷整數(shù) x(0<x<100) 是否是同構(gòu)數(shù)。 同構(gòu)數(shù):一個(gè)數(shù)它出現(xiàn)在它的平方數(shù)的右邊 例如 : 5 ,5 的平方數(shù)是 25,5 是 25 中右側(cè)的數(shù) ,所以 5 是同構(gòu)數(shù) ;又如 25 是 625 的同構(gòu)數(shù) .#include<stdio.h>main() long int x,y,i=10;int flag=0;for(x=1;x<100;x+)y=x*x;while(y/i!=0)/ 利用循環(huán)取余的方法進(jìn)行判斷/先讓y對(duì)10取余,判斷是否是同構(gòu)數(shù)if(y%i=x)/再對(duì)100取余判斷,直到y(tǒng)/i為0 f

15、lag=1;break; i=i*10;if(flag=1) printf("n%d是4 的同構(gòu)數(shù)!",x,y);flag=0;i=10;一個(gè)數(shù)如果恰好等于它的因子之和,這個(gè)數(shù)就稱為"完數(shù)"。例如 6=123。編程找出 1000以內(nèi)的所有完數(shù)。main() static int k11;int i,j,n,s;for(j=2;j<1000;j+) n=-1;s=j;for(i=1;i<j;i+)if(j%i)=0)n+;/ 找到質(zhì)因子s=s-i;/ 減去找到的因子 ,如果減到 s=0 說明 s 是完數(shù) kn=i; if(s=0)printf(

16、"%d is a wanshu",j); for(i=0;i<n;i+) printf("%d,",ki); printf("%dn",kn);弦數(shù):一個(gè)正整數(shù) x 其平方等于某兩個(gè)正整數(shù)平方之和。如 :3*3+4*4=5*5 , 那么 5 稱為弦數(shù)。 #include"stdio.h"#include"math.h"int main() int i,j,x,flag=0;long m,n;for(x=5;x<100;x+) for(i=1;i<x;i+) / 設(shè)另兩個(gè)正整數(shù)

17、(i,j) 分別都從 1 開始逐個(gè)計(jì)算 / 看是否滿足 x*x=i*i+j*j for(j=1;j<x;j+) / 也可以這樣寫 for(j=x;j>1;j-) n=i*i+j*j;m=x*x;if(m=n) flag=1;break; if(flag=1)printf("n 弦數(shù)為 %d %d*%d+%d*%d=%d*%d",x,i,i,j,j,x,x);flag=0;break; 10 行如下圖)14 110 5 1打印出楊輝三角形(要求打印出11 11 2 113 31461 5 10main() int i,j, a1010;printf("n

18、"); for(i=0;i<10;i+) ai0=1;aii=1; for(i=2;i<10;i+) for(j=1;j<i;j+) aij=ai-1j-1+ai-1j; for(i=0;i<10;i+) for(j=0;j<=i;j+) printf("%5d",aij); printf("n"); 輸入兩個(gè)正整數(shù) m和n,求其最大公約數(shù)和最小公倍數(shù)。分析:利用輾除法。#include<stdio.h>main()int a,b,num1,num2,temp;printf("please i

19、nput two numbers:n");scanf("%d,%d",&num1,&num2);if(num1!=0)temp=num1;num1=num2;num2=temp;a=num1;b=num2;while(b!=O) /*利用輾除法,直到 b為0為止*/temp=a%b;a=b;b=temp;printf("gongyueshu:%dn",a);printf("gongbeishu:%dn",num1*num2/a); 給一個(gè)正整數(shù),要求:一、求它是幾位數(shù),二、逆序打印出各位數(shù)字。 x 先對(duì) 10

20、 取余,然后 x=x/10 取整main( ) long a=0,x;printf("input a number:"); scanf("%ld",&x);printf("x 的各位為: ");while(x!=0)printf("%d,",x%10);/ 輸出個(gè)位x/=10;a+;/ 統(tǒng)計(jì)位數(shù)printf("n 你輸入的是 %d 位數(shù) ",a);將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出 90=2*3*3*5 。程序分析:對(duì) n 進(jìn)行分解質(zhì)因數(shù),應(yīng)先找到一個(gè)最小的質(zhì)數(shù)k,然后按下述

21、步驟完成:(1)如果這個(gè)質(zhì)數(shù)恰等于n則說明分解質(zhì)因數(shù)的過程已經(jīng)結(jié)束,打印出即可。如果 *>k,但n能被k整除,則應(yīng)打印出k的值,并用n除以k的商,作為新的正整數(shù)你 n, 重復(fù)執(zhí)行第一步。如果n不能被k整除,則用k+1作為k的值,重復(fù)執(zhí)行第一步。#include<stdio.h>main()int n,i;printf("nplease input a number:n");scanf("%d",&n);printf("%d=",n);for(i=2;i<=n;i+) while(n!=i)if(n%i=

22、0) printf("%d*",i);n=n/i; else break; printf("%d",n); 自然數(shù)對(duì) :兩個(gè)自然數(shù)的和與差都是平方數(shù)。如:8和 17 的和 8+17=25 與其差 17-8=9 ,25 和 9都是平方數(shù) ,則(8 和 17)就是自然數(shù)對(duì)在 100以內(nèi)有多少個(gè)自然數(shù)對(duì)列舉出兩個(gè)數(shù)的所有組合判斷是否滿足條件。#include<stdio.h>#include<math.h>main() int x,i,j,y;for(i=100;i>1;i-)for(j=1;j<100;j+) x=i+j;

23、y=i-j;if(y<0) break;/ 目的剔除重復(fù)的自然數(shù)對(duì)/用 sqrt 函數(shù)開方,如果是平方數(shù)開放后取整的乘積應(yīng)該相等 if(x=(int)sqrt(x)*(int)sqrt(x)&&y=(int)sqrt(y)*(int)sqrt(y)&&i!=j) printf(" 自然數(shù)對(duì): (%d, %d)n",i,j); 有 n 個(gè)整數(shù),使其前面各數(shù)順序向后移 m 個(gè)位置,最后 m 個(gè)數(shù)變成最前面的 m 個(gè)數(shù) move(array,n,m)int n,m,array20;int *p,array_end;array_end=*(ar

24、ray+n-1);for(p=array+n-1;p>array;p-)*p=*(p-1);*array=array_end;m-;if(m>0) move(array ,n,m);main()int number20,n,m,i;printf("the total numbers is:");scanf("%d",&n);printf("ninput %d nmuber",n);for(i=0;i<n;i+)scanf("%d",&numberi);printf("ba

25、ck m:");scanf("%d",&m);move(number,n,m); for(i=0;i<n;i+) printf("%d",numberi); 輸入一字符串判斷該字符串是否存在數(shù)字字符串, 統(tǒng)計(jì)數(shù)字字符串的個(gè)數(shù)并轉(zhuǎn)換為整數(shù)輸出。如:"abc1254pa45ui123",數(shù)字字符串個(gè)數(shù)為3轉(zhuǎn)換成整數(shù)1254、45、123輸出#include<stdio.h>int fun(char *str,long int *num) int i=0,flag=0,wz=1,n=0,k=0;char

26、temp50;dowhile(stri>='0'&&stri<='9') tempk+=stri;flag=1;i+;if(flag=1) while(-k>=0)numn=(tempk-'0')*wz+numn;wz*=10; k=0;n+;flag=0;wz=1; while(stri+);return n; main() char str50;long int num10=0;int total=0;printf("input string :n"); gets(str);total=f

27、un(str,num); printf("total=%d",total); while(total>0)printf("n%ld",num-total); 排序查找編程算法輸入 5 個(gè)整數(shù)存到數(shù)組中并用插入法排序。插入法:每一步將一個(gè)待排序元素按其關(guān)鍵字值 的大小插入到已排序序列的適當(dāng)位置上,直到待排序元素插入完為止。fun(int a,int n)int k,j,t; for(j=1;j<n;j+) t=aj;k=j-1; while(k>=0&&t>ak) ak+1=ak;k-;#include<std

28、io.h> / 小于 j 的為已排序列,大于 j 的為待排序列 /從待排序列中取一個(gè)值/ 讓 k 指向已排序列/在已排序列找插入位置,并將以排序中的 /值順序后移動(dòng)直到移動(dòng)到插入點(diǎn)ak+1=t; /k+1 的值就為插入點(diǎn) main() int a5,i;for(i=0;i<5;i+)printf("ninput a%d=",i);scanf("%d",&ai); fun(a,5);for(i=0;i<5;i+)printf("%4d",ai); 用冒泡法對(duì)數(shù)組進(jìn)行排序(升序) 。冒泡法排序:兩兩比較待排序序列

29、中的元素,并交換不滿 足順序要求的各對(duì)元素,直到全部滿足順序要求為止#include<stdio.h>void sort(int a,int n)int i,j,t; for(i=0;i<n-1;i+) for(j=0;j<n-i;j+)if(aj>aj+1)/ 兩兩比較 t=aj;aj=aj+1;aj+1=t;/ 交換不滿足升序條件的數(shù)對(duì)void main()int a5=5,10,-7,3,7,i,t,j;sort(a,5); for(i=0;i<=4;i+) printf("%5d ",ai); 輸入 10 個(gè)整數(shù),并對(duì) 10 個(gè)數(shù)

30、進(jìn)行排序(升序) 。選擇法:即從 10 個(gè)數(shù)中(待排序數(shù)) ,選擇 一個(gè)最小的與第一個(gè)元素交換,下次類推,即在后 9 個(gè)數(shù)中選擇一個(gè)最小值第二個(gè)元素進(jìn)行 交換。#define N 10main()int i,j,min,tem,aN;printf("please input ten num:n");for(i=0;i<N;i+) printf("a%d=",i);scanf("%d",&ai);printf("n");for(i=0;i<N;i+)/將輸入的數(shù)據(jù)輸出printf("%5

31、d",ai);printf("n");for(i=0;i<N-1;i+)min=i;/ 假設(shè)待排序中第 i 個(gè)數(shù)最小for(j=i+1;j<N;j+) /for 循環(huán)的目的是找最小的數(shù)if(amin>aj) min=j; / 找到一個(gè)更小的數(shù)tem=ai;/下面的語句將每次找到最小的數(shù)與第i 個(gè)數(shù)交換ai=amin;amin=tem; printf("After sorted n");for(i=0;i<N;i+)printf("%5d",ai); 輸入一個(gè)值查找它在數(shù)組中是否存在,如果存在統(tǒng)計(jì)它在數(shù)

32、組中出現(xiàn)的次數(shù)。順序查找:從 數(shù)組的首元素開始,逐個(gè)元素與待查找的關(guān)鍵字進(jìn)行比較,直到找到相等的。若整個(gè)數(shù)組中 沒有與待查找關(guān)鍵字相等的元素,就是查找不成功#include<stdio.h>main()int a10=3,56,56,9,9,12,34,46,67,44,i,x,cnt=0;printf("input x=");scanf("%d",&x);for(i=0;i<10;i+)if(x=ai)/ 順序查找cnt+;if(cnt>0) printf("nFind,cnt=%d",cnt);el

33、se printf("Not Find"); 有 10 個(gè)數(shù)按升序放在一個(gè)數(shù)組中, 輸入一個(gè)數(shù), 要求用折半查找該數(shù)是數(shù)組中的第幾個(gè)元素。 折半查找法:設(shè)數(shù)組長(zhǎng)度為n,則將輸入的數(shù) m與an/2比較,若m<an/2,則將a0到an/2 的數(shù)繼續(xù)折半進(jìn)行查找;若m=n/2,則表示找到該數(shù)的位置;若m>n/2,則將an/2到an的數(shù)繼續(xù)折半進(jìn)行查找。#include<stdio.h>main()int a10=12,32,45,62,71,76,80,85,90,95;int num,bott,top,mid;printf("input a n

34、umber:n");scanf("%d",&num);bott=0;top=9;while(bott<=top)mid=(bott+top)/2;if(num=amid)printf("%d is the %d numbern",num,mid+1);break;else if(num<amid) top=mid-1;else bott=mid+1; if(bott>top) printf("Non"); 字符串編程算法字符數(shù)組 s1, s2 把 s2 在 s1 中出現(xiàn)的字符全部刪除。 如 s1=&

35、quot;adeaabfce"s2="efd" 刪除后 s1 中的值為: aaabc#include<stdio.h>main() char s150,s210,*p1,*p2;int i,j;p1=s1;p2=s2; printf("input s1:"); scanf("%s",p1); printf("input s2"); scanf("%s",p2);while(*p2) for(i=0,j=0;p1i!='0'i+)if(p1i!=*p2)/ 對(duì)

36、 p1 重新賦值達(dá)到刪除目的 p1j+=p1i;p1j='0'/ 新字符串沒有 '0' 需要給它賦值一個(gè) p2+; puts(p1); 將 b 字符串連接到 a 后面 , 編寫函數(shù)實(shí)現(xiàn)此功能 #include<stdio.h> void fun(char *a,char *b) while(*a+);/ 找'0' 的位置a-;/a 已經(jīng)指向 '0'后面所以要自減while(*b) *a+=*b+;*a='0' main() char a100,b50; printf("input string

37、 a: "); scanf("%s",a); printf("input string b: "); scanf("%s",b); fun(a,b); printf("nstring a: %sn",a); 將 b 字符串復(fù)制到 a 中 ,編寫函數(shù)實(shí)現(xiàn)此功能 #include<stdio.h> void fun(char *a,char *b) while(*b) *a+=*b+;*a='0' main() char a50,b50; printf("input st

38、ring b: "); gets(b); fun(a,b); printf("nstring a: %sn",a); while輸入一行字符,分別統(tǒng)計(jì)出其中英文字母、空格、數(shù)字和其它字符的個(gè)數(shù)。分析:利用 語句 ,條件為輸入的字符不為 'n' 。#include "stdio.h"main()char c;int letters=0,space=0,digit=0,others=0; printf("please input some charactersn"); while(c=getchar()!='n') if(c>='a'&am

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論