C语言常见编程算法实例.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 常见 编程 算法 实例
- 资源描述:
-
C言语罕见编程算法实例 一、 对于数字上的一些编程算法 1. 输入9*9口诀乘法表。剖析:分行与列思索,共9行9列,i操纵行,j操纵列。 #include"stdio.h" main() {inti,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表现左对齐,占3位*/ }printf("\n");/*每一行后换行*/ }} 2. 求s=a+aa+aaa+aaaa+aa...a的值,此中a是一个数字。比方2+22+222+2222+22222(如今共有5个数相加),几多个数相加有键盘操纵。剖析:要害是盘算出每一项的值。 main() {inta,n,count=1; longintsn=0,tn=0; printf("pleaseinputaandn\n"); scanf("%d,%d",&a,&n); printf("a=%d,n=%d\n",a,n); while(count<=n) {tn=tn+a; sn=sn+tn; a=a*10; ++count; }printf("a+aa+...=%ld\n",sn);} 3. 公式∏/4=1-1/3+1/5-1/7+...+1/n,求∏的近似值,直到最初一项1/n的相对值小于0.000001。 #include<stdio.h> #include<math.h> main() {intf=1; doublepi=0,t=1,v=1; while(fabs(t)>1e-6) {pi=pi+t; v+=2; f=-f; t=f/v; } pi*=4; printf("∏=%f\n",pi);} 4. 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出那个数列的前20项之跟。 法那么:分子是前一项分子分母之跟,分母是前一项的分子。 main() {intn,t,number=20; floata=2,b=1,s=0; for(n=1;n<=number;n++) {s=s+a/b; t=a;a=a+b;b=t;/*序列法那么的实现*/ } printf("sumis%9.6f\n",s);} 5. 推断11<=x<=10000中的数那些是回文数,统计回文数个数,回文数每行输入10个。剖析:(1)让x从新形成新的数t,假如x==t那么是回文数.(2)剖析出x的列位,进展首尾比拟,假如都相称那么是回文数。 fun1()//算法一 {longx,i,t=0,s=10,cnt=0; for(x=11;x<10000;x++) {i=x; while(i!=0)//形成新的数 {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()//算法二 {longx,i,t=0,j=0,s=10,x1,cnt=0; inta[10]; for(x=11;x<10000;x++) {x1=x; while(x1!=0)//剖析出列位 {a[j]=x1%10; x1=x1/10; j++;} i=0;j--; while(i<j)//首尾比拟 if(a[i]==a[j]) i++,j--; elsebreak; if(i>=j) {printf("%5d",x); cnt++; if(cnt%10==0) printf("\n");} j=0;} printf("\ncnt=%5d",cnt);} main() {fun1();} 6. 求1+2!+3!+...+20!的跟。 main() {floatn,s=0,t=1; for(n=1;n<=20;n++) {t*=n;//实现阶乘 s+=t;//将阶乘累加 } printf("1+2!+3!...+20!=%e\n",s);//%e为迷信计数法输入 } 7. 输入一个年份推断它能否是闰年,满意上面前提之一就称为闰年: 〔1〕.能被4整除而不克不及被100整除。〔2〕.能被100整除也能被400整除。 #include<stdio.h> main() {longintyear; printf("inputyear:"); scanf("%d",&year); if(year%4==0&&year%100!=0||year%100==0&&year%400==0) printf("yes"); elseprintf("No");} 8. 将十进制数转换成恣意进制。剖析:将输入的数轮回除以基数取余直到商为0,而后逆序输入。 #include<stdio.h> voidmain()//idec为十进制数,ibase为要转换成数的基 {intidec,i,idr,p=0,ibase; charstrdr[20],t; printf("输入要转换的十进制数idec="); scanf("%d",&idec); printf("\n输入要转换成的进制基数(如:八进制那么输入8)ibase="); scanf("%d",&ibase); while(idec!=0)//轮回除以基数取余直到商为0 {idr=idec%ibase; if(idr>=10) strdr[p++]=idr-10+65;//将16进制的10,11,12,13,14,15与A,B,C,D,E,F对应 elsestrdr[p++]=idr+48;//将数字转换为数字字符 idec/=ibase;//失掉商,把那个商的值从新赋值给idec }//上面for轮回的目标是将取余的各数逆序寄存, for(i=0;i<p/2;i++) {t=strdr[i]; strdr[i]=strdr[p-i-1]; strdr[p-i-1]=t;} strdr[p]='\0'; printf("\n转换成%d进制后的数为:%s",ibase,strdr); printf("\n");} 9. 将一个数组逆序输入。剖析:用第一个与最初一个交流,而后用第二个与倒数第二个交流,其他依此类推。 #defineN5 main() {inta[N]={9,6,5,4,1},i,temp; printf("\noriginalarray:\n"); for(i=0;i<N;i++) printf("%4d",a[i]); for(i=0;i<N/2;i++) {temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;} printf("\nsortedarray:\n"); for(i=0;i<N;i++) printf("%4d",a[i]);} 10. 打印出一切的"水仙花数",所谓"水仙花数"是指一个三位数,其列位数字破方跟即是该数自身。比方:153是一个"水仙花数",由于153=1的三次方+5的三次方+3的三次方。剖析:应用for轮回操纵100-999个数,每个数剖析出个位,十位,百位。 main() {inti,j,k,n; printf("'waterflower'numberis:"); for(n=100;n<1000;n++) {i=n/100;/*剖析出百位*/ j=n/10%10;/*剖析出十位*/ k=n%10;/*剖析出个位*/ if(i*100+j*10+k==i*i*i+j*j*j+k*k*k) {printf("%-5d",n); }} printf("\n");} 11. 寻出3-1000中的全体素数。素数(质数):只能被1跟自身整除的天然数(1除外). 如2357是素数。 #include<stdio.h> #include<math.h> main() {inti,j,cnt=0; for(i=3;i<=1000;i++) {for(j=2;j<=sqrt(i);j++)//i能被j整除阐明不是素数,数学上曾经证实只要求推断 {if(i%j==0) break; }//j<=sqrt〔i〕,i都不克不及被j整除就能证实i为素数。 if(j>sqrt(i)) {printf("%4d",i); cnt++; if(cnt%5==0) printf("\n");//操纵每行输入5个数 }}} 12. 推断整数x(0<x<100)能否是同构数。同构数:一个数它出如今它的平方数的左边 比方:5,5的平方数是25,5是25中右侧的数,因此5是同构数;又如25是625的同构数. #include<stdio.h> main() {longintx,y,i=10; intflag=0; for(x=1;x<100;x++) {y=x*x; while(y/i!=0)//应用轮回取余的办法进展推断 {//先让y对10取余,推断能否是同构数 if(y%i==x)//再对100取余推断,直到y/i为0 {flag=1; break; } i=i*10;} if(flag==1)printf("\n%d是%d的同构数!",x,y); flag=0; i=10; }} 13. 一个数假如恰恰即是它的因子之跟,那个数就称为"完数"。比方6=1+2+3。编程寻出1000以内的一切完数。 main() {staticintk[11]; inti,j,n,s; for(j=2;j<1000;j++) {n=-1; s=j; for(i=1;i<j;i++) {if((j%i)==0) {n++;//寻到质因子 s=s-i;//减去寻到的因子,假如减到s=0阐明s是完数 k[n]=i;}} if(s==0) {printf("%disawanshu",j); for(i=0;i<n;i++) printf("%d,",k[i]); printf("%d\n",k[n]); }}} 14. 弦数:一个正整数x其平方即是某两个正整数平方之跟。如:3*3+4*4=5*5,那么5称为弦数。 #include"stdio.h" #include"math.h" intmain() {inti,j,x,flag=0; longm,n; for(x=5;x<100;x++) for(i=1;i<x;i++)//设另两个正整数(i,j)分不都从1开场逐一盘算 {//看能否满意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弦数为%d%d*%d+%d*%d=%d*%d",x,i,i,j,j,x,x); flag=0; break;}}} 15. 打印出杨辉三角形〔请求打印出10行如以下列图〕 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 main() {inti,j,a[10][10]; printf("\n"); for(i=0;i<10;i++) {a[i][0]=1; a[i][i]=1;} for(i=2;i<10;i++) for(j=1;j<i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<10;i++) {for(j=0;j<=i;j++) printf("%5d",a[i][j]); printf("\n");}} 16. 输入两个正整数m跟n,求其最年夜条约数跟最小公倍数。剖析:应用辗除法。 #include<stdio.h> main() {inta,b,num1,num2,temp; printf("pleaseinputtwonumbers:\n"); scanf("%d,%d",&num1,&num2); if(num1!=0) {temp=num1; num1=num2; num2=temp; } a=num1;b=num2; while(b!=0)/*应用辗除法,直到b为0为止*/ {temp=a%b; a=b; b=temp; } printf("gongyueshu:%d\n",a); printf("gongbeishu:%d\n",num1*num2/a);} 17. 给一个正整数,请求:一、求它是几多位数,二、逆序打印出列位数字。x先对10取余,而后x=x/10取整 main() { longa=0,x; printf("inputanumber:"); scanf("%ld",&x); printf("x的列位为:"); while(x!=0) {printf("%d,",x%10);//输入个位 x/=10; a++;//统计位数 } printf("\n你输入的是%d位数",a);} 18. 将一个正整数剖析质因数。比方:输入90,打印出90=2*3*3*5。次序剖析:对n进展剖析质因数,应先寻到一个最小的质数k,而后按下述步调实现: (1)假如那个质数恰即是n,那么阐明剖析质因数的进程曾经完毕,打印出即可。 (2)假如n<>k,但n能被k整除,那么应打印出k的值,并用n除以k的商,作为新的正整数你n, 反复履行第一步。 (3)假如n不克不及被k整除,那么用k+1作为k的值,反复履行第一步。 #include<stdio.h> main() {intn,i; printf("\npleaseinputanumber:\n"); scanf("%d",&n); printf("%d=",n); for(i=2;i<=n;i++) {while(n!=i) {if(n%i==0) {printf("%d*",i); n=n/i;} elsebreak;}} printf("%d",n);} 19. 天然数对:两个天然数的跟与差基本上平方数。如:8跟17的跟8+17=25与其差17-8=9,25跟9基本上平方数,那么(8跟17)确实是天然数对在100以内有几多个天然数对罗列出两个数的一切组合推断能否满意前提。 #include<stdio.h> #include<math.h> main() { intx,i,j,y; for(i=100;i>1;i--) for(j=1;j<100;j++) { x=i+j; y=i-j; if(y<0)break;//目标剔除反复的天然数对 //用sqrt函数开方,假如是平方数开放后取整的乘积应当相称 if(x==(int)sqrt(x)*(int)sqrt(x)&&y==(int)sqrt(y)*(int)sqrt(y)&&i!=j) printf("天然数对:(%d,%d)\n",i,j); }} 20. 有n个整数,使其前面各数次序向后移m个地位,最初m个数酿成最前面的m个数 move(array,n,m) intn,m,array[20]; { int*p,array_end; array_end=*(array+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() {intnumber[20],n,m,i; printf("thetotalnumbersis:"); scanf("%d",&n); printf("\ninput%dnmuber",n); for(i=0;i<n;i++) scanf("%d",&number[i]); printf("backm:"); scanf("%d",&m); move(number,n,m); for(i=0;i<n;i++) printf("%d",number[i]);} 21. 输入一字符串推断该字符串能否存在数字字符串,统计数字字符串的个数并转换为整数输入。如:"abc1254pa45ui123",数字字符串个数为3转换成整数1254、45、123输入 #include<stdio.h> intfun(char*str,longint*num) {inti=0,flag=0,wz=1,n=0,k=0; chartemp[50]; do {while(str[i]>='0'&&str[i]<='9') {temp[k++]=str[i]; flag=1; i++;} if(flag==1) {while(--k>=0) {num[n]=(temp[k]-'0')*wz+num[n]; wz*=10;} k=0; n++; flag=0; wz=1; }} while(str[i++]); returnn;} main() {charstr[50]; longintnum[10]={0}; inttotal=0; printf("inputstring:\n"); gets(str); total=fun(str,num); printf("total=%d",total); while(total>0) {printf("\n%ld",num[--total]);}} 二、 排序查寻编程算法 1. 输入5个整数存到数组中并用拔出法排序。拔出法:每一步将一个待排序元素按其要害字值的巨细拔出到已排序序列的恰当地位上,直到待排序元素拔出完为止。 #include<stdio.h> fun(inta[],intn) {intk,j,t; for(j=1;j<n;j++)//小于j的为已排序列,年夜于j的为待排序列 {t=a[j];//从待排序列中取一个值 k=j-1;//让k指向已排序列 while(k>=0&&t>a[k])//在已排序列寻拔出地位,并将以排序中的 {a[k+1]=a[k];k--;}//值次序后挪动直到挪动到拔出点 a[k+1]=t;//k+1的值就为拔出点 }} main() {inta[5],i; for(i=0;i<5;i++) {printf("\ninputa[%d]=",i); scanf("%d",&a[i]);} fun(a,5); for(i=0;i<5;i++) printf("%4d",a[i]);} 2. 用冒泡法对数组进展排序〔升序〕。冒泡法排序:两两比拟待排序序列中的元素,并交流不满意次序请求的各对元素,直到全体满意次序请求为止 #include<stdio.h> voidsort(inta[],intn) {inti,j,t; for(i=0;i<n-1;i++) for(j=0;j<n-i;j++) if(a[j]>a[j+1])//两两比拟 {t=a[j];a[j]=a[j+1];a[j+1]=t;}//交流不满意升序前提的数对 } voidmain() {inta[5]={5,10,-7,3,7},i,t,j; sort(a,5); for(i=0;i<=4;i++) printf("%5d",a[i]);} 3. 输入10个整数,并对10个数进展排序〔升序〕。抉择法:即从10个数中〔待排序数〕,抉择一个最小的与第一个元故旧流,下次类推,即在后9个数中抉择一个最小值第二个元素进展交流。 #defineN10 main() {inti,j,min,tem,a[N]; printf("pleaseinputtennum:\n"); for(i=0;i<N;i++) {printf("a[%d]=",i); scanf("%d",&a[i]);} printf("\n"); for(i=0;i<N;i++)//将输入的数据输入 printf("%5d",a[i]); printf("\n"); for(i=0;i<N-1;i++) {min=i;//假定待排序中第i个数最小 for(j=i+1;j<N;j++)//for轮回的目标是寻最小的数 if(a[min]>a[j])min=j;//寻到一个更小的数 tem=a[i];//上面的语句将每次寻到最小的数与第i个数交流 a[i]=a[min]; a[min]=tem;} printf("Aftersorted\n"); for(i=0;i<N;i++) printf("%5d",a[i]);} 4. 输入一个值查寻它在数组中能否存在,假如存在统计它在数组中呈现的次数。次序查寻:从数组的首元素开场,逐一元素与待查寻的要害字进展比拟,直到寻到相称的。假定全部数组中不与待查寻要害字相称的元素,确实是查寻不胜利 #include<stdio.h> main() {inta[10]={3,56,56,9,9,12,34,46,67,44},i,x,cnt=0; printf("inputx="); scanf("%d",&x); for(i=0;i<10;i++) if(x==a[i])//次序查寻 cnt++; if(cnt>0)printf("\nFind,cnt=%d",cnt); elseprintf("NotFind");} 5. 有10个数按升序放在一个数组中,输入一个数,请求用折半查寻该数是数组中的第几多个元素。折半查寻法:设数组长度为n,那么将输入的数m与a[n/2]比拟,假定m<a[n/2],那么将a[0]到a[n/2]的数接着折半进展查寻;假定m=[n/2],那么表现寻到该数的地位;假定m>[n/2],那么将a[n/2]到a[n]的数接着折半进展查寻。 #include<stdio.h> main() {inta[10]={12,32,45,62,71,76,80,85,90,95}; intnum,bott,top,mid; printf("inputanumber:\n"); scanf("%d",&num); bott=0; top=9; while(bott<=top) {mid=(bott+top)/2; if(num==a[mid]){printf("%disthe%dnumber\n",num,mid+1);break;} elseif(num<a[mid])top=mid-1; elsebott=mid+1;} if(bott>top)printf("No\n");} 三、 字符串编程算法 1. 字符数组s1,s2把s2在s1中呈现的字符全体删除。如s1[]="adeaabfce";s2[]="efd";删除后s1中的值为:aaabc #include<stdio.h> main() {chars1[50],s2[10],*p1,*p2; inti,j; p1=s1; p2=s2; printf("inputs1:"); scanf("%s",p1); printf("inputs2"); scanf("%s",p2); while(*p2) { for(i=0,j=0;p1[i]!='\0';i++) if(p1[i]!=*p2)//对p1从新赋值到达删除目标 p1[j++]=p1[i]; p1[j]='\0';//新字符串不'\0'需求给它赋值一个 p2++;} puts(p1);} 2. 将b字符串衔接到a前面,编写函数实现此功用 #include<stdio.h> voidfun(char*a,char*b) {while(*a++);//寻'\0'的地位 a--;//a曾经指向'\0'前面因此要自减 while(*b)*a++=*b++; *a='\0';} main() { chara[100],b[50]; printf("inputstringa:"); scanf("%s",a); printf("inputstringb:"); scanf("%s",b); fun(a,b); printf("\nstringa:%s\n",a);} 3. 将b字符串复制到a中,编写函数实现此功用 #include<stdio.h> voidfun(char*a,char*b) {while(*b)*a++=*b++; *a='\0';} main() { chara[50],b[50]; printf("inputstringb:"); gets(b); fun(a,b); printf("\nstringa:%s\n",a);} 4. 输入一行字符,分不统计出此中英笔墨母、空格、数字跟别的字符的个数。剖析:应用while语句,前提为输入的字符不为'\n'。 #include"stdio.h" main() {charc; intletters=0,space=0,digit=0,others=0; printf("pleaseinputsomecharacters\n"); while((c=getchar())!='\n') {if(c>='a'&&c<='z'||c>='A'&&c<='Z')letters++; elseif(c=='')space++; elseif(c>='0'&&c<='9')digit++; elseothers++;} printf("allinall:char=%dspace=%ddigit=%dothers=%d\n",letters,space,digit,others); } 5. 打印出如以下列图形: * *** ***** *** * main() {intx,i,j,n=3; //上三角形,空格个数递加,*号递增。 for(i=0;i<3;i++) {for(j=n--;j>0;j--) printf(""); for(x=0;x<2*i+1;x++) printf("*"); printf("\n"); } //下三角形,空格个数递增,*号递加。 n=1; for(i=3;i>0;i--) {for(j=0;j<=n;j++) printf(""); for(x=2*(i-1)-1;x>0;x--) printf("*"); n++; printf("\n");} 6. 把数组s2中的一切字符拔出到s1的第n个字符前面。剖析:先要把从n个字符前面的字符都次序后移,再进展字符拔出操纵。 #include<stdio.h> #include<stdlib.h> #include<string.h> char*insert(char*s1,char*s2,intn) {char*p1; inti,len1,len2; len1=strlen(s1); len2=strlen(s2); p1=s1; for(i=strlen(s1)-1;i>n;i--) *(s1+i+len2)=*(s1+i); while(*s2) {*(s1+i)=*s2; i++;s2++; } *(p1+len1+len2)='\0'; returnp1; } main() {chars1[50],s2[10],*p; intn; printf("\ninputs1"); scanf("%s",s1); printf("\ninputs2"); scanf("%s",s2); printf("\ninputn"); scanf("%d",&n); if(n<strlen(s1))p=insert(s1,s2,n); else{printf("error:n>strlen(s1)"); exit(0);} puts(p);}展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




C语言常见编程算法实例.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/4708659.html