1、最新C语言常用算法集合汇总C语言常用算法集合1.定积分近似计算:/*梯形法*/double integral(double a,double b,long n) long i;double s,h,x; h=(b-a)/n; s=h*(f(a)+f(b)/2; x=a; for(i=1;in;i+) x+=h; s+=h*f(x) ; return(s);/*矩形法*/double integral(double a,double b,long n) long i;double t=0,h,x; h=(b-a)/n; x=a; for(i=0;in;i+) t+=h*f(x); x+=h; r
2、eturn(t);2. 生成斐波那契数列:/*直接计算*/int fib(int n) int i,f1=1,f2=1,f; for(i=3;i=n;i+) f=f1+f2; f1=f2; f2=f; if(n=1|n=2) return 1; else return f;/*递归调用*/void fib(int n,int*s) int f1,f2; if(n=1|n=2) *s=1; else fib(n-1,&f1); fib(n-2,&f2); *s=f1+f2; 3.素数的判断:/*方法一*/ for (t=1,i=2;in; i+) if(n%i=0) t=0; if(t) pri
3、ntf(%d is prime,n);/*方法二*/for (t=1,i=2;in&t; i+) if(n%i=0) t=0; if(t) printf(%d is prime,n);/*方法三*/for (i=2;in; i+) if(n%i=0) break; if(i=n) printf(%d is prime,n);/*方法四*/for(t=1,i=2; i0;n/=10) k=10*k+n%10; return k;/*求回文数*/int f(long n) long k,m=n; for(k=0;n0;n/=10) k=10*k+n%10; if(m=k) return 1; re
4、turn 0;/*求整数位数*/int f(long n) int count; for(count=0;n0;n/=10) count+; return count;5.求最大公约数:/*方法一*/int gcd(int x,int y) int z; z=xy?x:y; while(!(x%z=0&y%z=0)/*x%z|y%z*/ z-; return z;/*方法二*/int gcd(int x,int y) int r; while(r=x%y)!=0) x=y; y=r; return y;/*方法三*/int gcd(int a ,int b) int r ; if(r=a%b)
5、=0) return b; else return gcd(b,r);6.数组常用算法:查找:/*线性查找*/int find(int num,int x,int key) int i,m=-1; for(i=0;inum;i+) if(xi=key) m=i; break; return m;/*折半查找*/int find(int x,int num,int key) int m=-1,low=0,high=num-1,mid; while(lowkey) high=mid-1; else low=mid+1; return m;/*折半查找(递归)*/int b_search(int x
6、 ,int low,int high,int key) int mid; mid=(low+high)/2; if(xmid=key) return mid; if(low=high) return -1; else if(keyxmid) return b_search(x,low,mid-1,key); else return b_search(x,mid+1,high,key); /*寻找子串*/int find(char *s1,char *s2) int i,k=0; while(s1i=s2i) i+; if(s2i=0) return k; s1+; k+; return -1;
7、分词:/*方法一*/void fen(char s10,char str) int i,j,k; for(i=0,j=0,k=0;stri!=0;i+) if(isalpha(ai) sjk+=stri; else sjk=0; k=0; j+; /*方法二*/#include#includevoid main() int i=0,n=0;char s80,*p; strcpy(s,It is a book.); for(p=s;p!=0;p+) if(*p=) i=0; else if(i=0) n+;i=1; printf(%dn,n); getch();排序:/*插入法排序*/void
8、sort(int a,int n) int i,j,t; for(i=1;i=0&taj;j-) aj+1=aj; aj=t; /*归并排序*/#define x 10#define y 10void com(int *a,int *b,int *c) int i,j,k; for(i=0,j=0,k=0;i=x&j=y;) if(aibj) ck+=ai;i+; else ck+=bj;j+; if(ix) for(k=k-1;ix;i+) ck+=ai; if(jx) for(k=k-1;jy;j+) ck+=aj;/*交换法排序1 冒泡排序*/void sort(int a,int n)
9、 int i,j,t,flag; for(i=0;in-1;i+) flag=1; for(j=0;jaj+1) t=aj; aj=aj+1; aj+1=t; flag=0; if(flag) break; /*交换法排序2*/void sort(int a,int n) int i,j,t; for(i=0;in-1;i+) for(j=i+1;jaj) t=ai; ai=aj; aj=t; /*选择法排序*/void sort(int a,int n) int i,j,point,t; for(i=0;in-1;i+) point=i; for(j=i+1;jn;j+) if(apoint
10、aj) point=j; if(point!=i) t=apoint; apoint=ai; ai=t; 7.一元非线性方程求根:/*牛顿迭代法求函数跟*/#include #include int main(void) double x,x1,eps=1e-6,f,f1; /*误差为eps*/ x=1.0; /*x=1.0是初值*/ do x1=x; f=6-x1*(5-x1*(4-3*x1); /*f为f(x)函数*/ f1=-5+x1*(8-9*x1); /*f1为f(x)的导函数*/ x=x1-f/f1; f=6-x*(5-x*(4-3*x); while(fabs(f)=eps &
11、fabs(x-x1)=eps); printf(x=%f,x); /*二分法求函数跟*/#include #include double f(double x) return 6-x*(5-x*(4-3*x); /*f(x)函数*/int main(void) double a,b,c,x,eps=1e-6; do scanf(%lf%lf,&a,&b); while(f(a)*f(b)0); if(fabs(f(a)1e-6) x=a;else if (fabs(f(b)eps&fabs(b-a)eps) if(f(a)*f(c)eps) if(f(a)*f(c)0) b=c; else a
12、=c; c=(a*f(b)-b*f(a)/ (f(b)-f(a); #include void f();int main(void) int x, loop=0; do for(x=1;x5;x+) int x=2; printf(%d,x); printf(%d ,x); f(); loop+; while(loop1); getch();void f() printf(%d,x+); 8.汉诺塔:#includevoid Hanoi(int n, char A, char B, char C) if(n=1) printf(n move %d from %c to %c,n,A,C); e
13、lse Hanoi(n-1,A,C,B); printf(nmove %d from %c to %c,n,A,C); Hanoi(n-1,B, A, C); int main(void) Hanoi(3,A,B,C); getch();9.建立链表:NODE *creat(void) /* void表示无参函数 */ NODE *head=NULL,*p1=NULL,*p2=NULL; long num; unsigned score; int n=0; do scanf(“%ld%u”,&num,&score); if(num=0) break; n+; p1=(NODE *)malloc
14、(sizeof(NODE); p1-data.num=num, p1-data.score=score; p1-next=NULL; if(n=1) head=p2=p1; else p2-next=p1; p2=p1; while(1); return head;10.级数的近似计算:#include #include int main(void) double s=1,a=1,x,eps,f; int n,m; printf(input x and eps:); scanf (%lf%lf,&x,&eps); for(n=1;fabs(a)eps; n+) for(f=1,m=1;m=n;m+) f*=m; a=pow(x,n)/f; s+=a; printf(%f,s);