C语言常见编程算法实例_第1页
C语言常见编程算法实例_第2页
C语言常见编程算法实例_第3页
C语言常见编程算法实例_第4页
C语言常见编程算法实例_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、常见编程算法实例一、 关于数字上的一些编程算法1. 输出9*9口诀乘法表。分析:分行与列考虑,共9行9列,i控制行,j控制列。#include stdio.hmain() int i,j,result; printf(n);for (i=1;i10;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个数相加),几个数相加有键

2、盘控制。分析:关键是计算出每一项的值。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;printf(a+aa+.=%ldn,sn); 3. 公式/4=1-1/3+1/5-1/7+.+ 1/n ,求的近似值,直到最后一项1/n 的绝对值小于0.。#include#includemain() int f=1; do

3、uble pi=0,t=1,v=1; while(fabs(t)1e-6) pi=pi+t;v+=2;f=-f;t=f/v; pi*=4;printf(=%fn,pi); 4. 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13.求出这个数列的前20项之和。规律:分子是前一项分子分母之和,分母是前一项的分子。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;/*序列规律的实现*/printf(sum is %9.6fn,s); 5. 判断11=x=10000中

4、的数那些是回文数,统计回文数个数,回文数每行输出10个。分析:(1) 让x重新构成新的数 t,如果x=t则是回文数 .(2) 分解出x的各位,进行首尾比较,如果都相等则是回文数。fun1()/算法一 long x,i,t=0,s=10,cnt=0; for(x=11;x10000;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()/算法二 long x,i,t=0,j=0,s=10,

5、x1,cnt=0; int a10; for(x=11;x10000;x+) x1=x; while(x1!=0)/分解出各位 a j =x1%10; x1=x1/10; j+; i=0;j-; while(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()float n,s=0,t=1; for(n=1;n=20;n+) t*=n; /实现阶乘 s+=t; /将阶乘累加 printf(1+2!+3!.+20!=

6、%en,s); /%e 为科学计数法输出7. 输入一个年份判断它是否是闰年,满足下面条件之一就称为闰年:(1).能被4整除而不能被100整除。(2).能被100整除也能被400整除。#includemain()long int year; printf(input year:); scanf(%d,&year); if(year%4=0& year%100!=0|year%100=0&year%400=0) printf(yes); else printf(No); 8. 将十进制数转换成任意进制。分析:将输入的数循环除以基数取余直到商为0 ,然后逆序输出。#includevoid main(

7、) / idec为十进制数,ibase为要转换成数的基 int idec,i, idr, p=0,ibase; char strdr20,t; printf(输入要转换的十进制数idec=); scanf(%d,&idec); printf(n输入要转换成的进制基数(如:八进制 则输入8)ibase=); scanf(%d,&ibase); while(idec!=0) /循环除以基数取余 直到商为0 idr=idec % ibase; if(idr=10) strdrp+=idr-10+65; /将16进制的10,11,12,13,14,15与A,B,C,D,E,F对应 else strdr

8、p+=idr+48; /将数字转换为数字字符 idec/=ibase; /得到商,把这个商的值重新赋值给idec /下面for循环的目的是将取余的各数逆序存放, for(i=0; ip/2; i+) t=strdri; strdri=strdrp-i-1; strdrp-i-1=t; strdrp=0;printf(n转换成%d进制后的数为:%s,ibase,strdr);printf(n); 9. 将一个数组逆序输出。分析:用第一个与最后一个交换,然后用第二个与倒数第二个交换,其余依此类推。#define N 5main()int aN=9,6,5,4,1,i,temp; printf(n

9、original array:n); for(i=0;iN;i+) printf(%4d,ai); for(i=0;iN/2;i+) temp=ai; ai=aN-i-1; aN-i-1=temp; printf(n sorted array:n);for(i=0;iN;i+) printf(%4d,ai); 10. 打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,因为153=1的三次方5的三次方3的三次方。分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。main()int i,j,k,n;printf(wa

10、ter flowernumber is:); for(n=100;n1000;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除外).如 2 3 5 7是素数。#include#includemain()int i,j,cnt=0; for(i=3;i=1000;i+) for(j=2;j=sqrt(i);j+)/i能被j

11、整除说明不是素数,数学上已经证明只需要判断 if(i%j=0) break; / jsqrt(i) printf(%4d,i); cnt+; if(cnt%5=0) printf(n); /控制每行输出5个数 12. 判断整数x(0x100)是否是同构数。 同构数:一个数它出现在它的平方数的右边例如: 5 ,5的平方数是25,5是25中右侧的数,所以5是同构数;又如25 是625的同构数.#includemain() long int x,y,i=10; int flag=0; for(x=1;x100;x+) y=x*x; while(y/i!=0) /利用循环取余的方法进行判断 /先让y对

12、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=123。编程找出1000以内的所有完数。main() static int k11;int i,j,n,s;for(j=2;j1000;j+) n=-1; s=j; for(i=1;ij;i+) if(j%i)=0) n+;/找到质因子 s=s-i;/减去找到的因子,如果减到s=0说明s是完数 kn=i

13、; if(s=0)printf(%d is a wanshu,j);for(i=0;in;i+)printf(%d,ki);printf(%dn,kn);14. 弦数:一个正整数x其平方等于某两个正整数平方之和。如:3*3+4*4=5*5 ,那么5称为弦数。#includestdio.h#includemath.h int main() int i,j,x,flag=0; long m,n; for(x=5;x100;x+) for(i=1;ix;i+) /设另两个正整数(i,j)分别都从1开始逐个计算 /看是否满足x*x=i*i+j*j for(j=1;j1;j-) n=i*i+j*j; m

14、=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行如下图) 11 11 2 11 3 3 11 4 6 4 11 5 10105 1 main() int i,j, a1010;printf(n);for(i=0;i10;i+) ai0=1; aii=1;for(i=2;i10;i+) for(j=1;ji;j+) aij=ai-1j-1+ai-1j;for(i=0;i10;i+)for(j=0;j

15、=i;j+) printf(%5d,aij); printf(n); 16. 输入两个正整数m和n,求其最大公约数和最小公倍数。分析:利用辗除法。#includemain()int a,b,num1,num2,temp;printf(please input two numbers: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:%dn,a);p

16、rintf(gongbeishu:%dn,num1*num2/a); 17. 给一个正整数,要求:一、求它是几位数,二、逆序打印出各位数字。x先对10取余,然后x=x/10取整main( )long a=0,x; printf(input a number:); 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,然后按

17、下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。(2)如果nk,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。#includemain()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=0) printf(%d*,i);n=n/i; else break; printf(%d,n); 19. 自

18、然数对:两个自然数的和与差都是平方数。 如:8和17 的和8+17=25与其差17-8=9 ,25和9 都是平方数,则(8 和17)就是自然数对在100以内有多少个自然数对列举出两个数的所有组合判断是否满足条件。#include#includemain()int x,i,j,y;for(i=100;i1;i-)for(j=1;j100;j+) x=i+j;y=i-j;if(yarray;p-) *p=*(p-1); *array=array_end; m-; if(m0) move(array,n,m);main()int number20,n,m,i;printf(the total num

19、bers is:);scanf(%d,&n);printf(ninput %d nmuber,n);for(i=0;in;i+) scanf(%d,&numberi);printf(back m:);scanf(%d,&m);move(number,n,m);for(i=0;in;i+) printf(%d,numberi); 21. 输入一字符串判断该字符串是否存在数字字符串,统计数字字符串的个数并转换为整数输出。如:abc1254pa45ui123,数字字符串个数为3转换成整数1254、45、123输出#includeint fun(char *str,long int *num) int

20、 i=0,flag=0,wz=1,n=0,k=0; char temp50; do while(stri=0&stri=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=fun(str,num);printf(total=%d,total);while(total0)printf(n%ld,num-tota

21、l); 二、 排序查找编程算法1. 输入5个整数存到数组中并用插入法排序。插入法:每一步将一个待排序元素按其关键字值的大小插入到已排序序列的适当位置上,直到待排序元素插入完为止。#includefun(int a,int n)int k,j,t;for(j=1;j=0&tak) /在已排序列找插入位置,并将以排序中的ak+1=ak;k-; /值顺序后移动直到移动到插入点ak+1=t; /k+1的值就为插入点 main() int a5,i; for(i=0;i5;i+) printf(ninput a%d=,i); scanf(%d,&ai); fun(a,5); for(i=0;i5;i+)

22、 printf(%4d,ai); 2. 用冒泡法对数组进行排序(升序)。冒泡法排序:两两比较待排序序列中的元素,并交换不满足顺序要求的各对元素,直到全部满足顺序要求为止#includevoid sort(int a,int n)int i,j,t;for(i=0;in-1;i+) for(j=0;jaj+1)/两两比较 t=aj;aj=aj+1;aj+1=t;/交换不满足升序条件的数对void main()int a5=5,10,-7,3,7,i,t,j; sort(a,5); for(i=0;i=4;i+) printf(%5d ,ai); 3. 输入10个整数,并对10个数进行排序(升序)

23、。选择法:即从10个数中(待排序数),选择一个最小的与第一个元素交换,下次类推,即在后9个数中选择一个最小值第二个元素进行交换。#define N 10main()int i,j,min,tem,aN;printf(please input ten num:n);for(i=0;iN;i+) printf(a%d=,i);scanf(%d,&ai);printf(n);for(i=0;iN;i+) /将输入的数据输出printf(%5d,ai);printf(n);for(i=0;iN-1;i+)min=i; /假设待排序中第i个数最小 for(j=i+1;jaj) min=j; / 找到一个

24、更小的数tem=ai; /下面的语句将每次找到最小的数与第i个数交换ai=amin;amin=tem; printf(After sorted n);for(i=0;iN;i+)printf(%5d,ai); 4. 输入一个值查找它在数组中是否存在,如果存在统计它在数组中出现的次数。顺序查找:从数组的首元素开始,逐个元素与待查找的关键字进行比较,直到找到相等的。若整个数组中没有与待查找关键字相等的元素,就是查找不成功#includemain()int a10=3,56,56,9,9,12,34,46,67,44,i,x,cnt=0; printf(input x=); scanf(%d,&x)

25、; for(i=0;i0) printf(nFind,cnt=%d,cnt); else printf(Not Find); 5. 有10个数按升序放在一个数组中,输入一个数,要求用折半查找该数是数组中的第几个元素。折半查找法:设数组长度为n,则将输入的数m与an/2比较,若mn/2,则将an/2到an的数继续折半进行查找。#includemain()int a10=12,32,45,62,71,76,80,85,90,95;int num,bott,top,mid;printf(input a number:n);scanf(%d,&num);bott=0;top=9;while(bott=

26、top)mid=(bott+top)/2;if(num=amid)printf(%d is the %d numbern,num,mid+1);break;else if(numtop) printf(Non); 三、 字符串编程算法1. 字符数组s1,s2 把s2在s1中出现的字符全部删除。如s1=adeaabfce;s2=efd;删除后s1中的值为:aaabc #includemain() char s150,s210,*p1,*p2; int i,j; p1=s1; p2=s2; printf(input s1:); scanf(%s,p1); printf(input s2); sca

27、nf(%s,p2); while(*p2) for(i=0,j=0;p1i!=0;i+) if(p1i!=*p2)/对p1重新赋值达到删除目的 p1j+=p1i; p1j=0;/新字符串没有0需要给它赋值一个 p2+; puts(p1); 2. 将b字符串连接到a后面,编写函数实现此功能#includevoid fun(char *a,char *b) while(*a+); /找0的位置 a-; /a已经指向0后面所以要自减 while(*b) *a+=*b+;*a=0; main()char a100,b50;printf(input string a: );scanf(%s,a);printf(input string b: );scanf(%s,b);fun(a,b);printf(nstring a: %sn,a); 3. 将b字符串复制到a中,编写函数实现此功能#includevoid fun(char *a,char *b)while(*b) *a+=*b+;*a=0; main()char a50,b50;printf(input string b: );gets(b);fun(a,b);printf(nstring a: %sn,a);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论