搜档网
当前位置:搜档网 › 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;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;i

t+=h*f(x);

x+=h;

}

return(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;i

if(n%i==0) t=0;

if(t) printf("%d is prime",n);

/*方法二*/

for (t=1,i=2;i

if(n%i==0) t=0;

if(t) printf("%d is prime",n);

/*方法三*/

for (i=2;i

if(n%i==0) break;

if(i==n) printf("%d is prime",n); /*方法四*/

for(t=1,i=2; i<=(int)sqrt(n); i++)

if(n%i==0){

t=0;

break;

}

if(t) printf("%d is prime",n);

4.反序数:

/*求反序数*/

long fan(long n)

{ long k;

for(k=0;n>0;n/=10)

k=10*k+n%10;

return k;

}

/*求回文数*/

int f(long n)

{ long k,m=n;

for(k=0;n>0;n/=10)

k=10*k+n%10;

if(m==k) return 1;

return 0;

}

/*求整数位数*/

int f(long n)

{ int count;

for(count=0;n>0;n/=10)

count++;

return count;

}

5.求最大公约数:

/*方法一*/

int gcd(int x,int y)

{ int z;

z=x

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)==0)

return b;

else

return gcd(b,r);

}

6.数组常用算法:

查找:

/*线性查找*/

int find(int num,int x[],int key)

{ int i,m=-1;

for(i=0;i

if(x[i]==key){

m=i;

break;

}

return m;

}

/*折半查找*/

int find(int x[],int num,int key)

{ int m=-1,low=0,high=num-1,mid;

while(low<=high){

mid=(low+high)/2;

if(x[mid]==key){

m=mid;

break;

}

else if(x[mid]>key) high=mid-1;

else low=mid+1;

}

return m;

}

/*折半查找(递归)*/

int b_search(int x[ ],int low,int high,int key) {

int mid;

mid=(low+high)/2;

if(x[mid]==key) return mid;

if(low>=high) return -1;

else if(key

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(s1[i]==s2[i]) i++;

if(s2[i]==0) return k;

s1++;

k++;

return -1;

}

分词:

/*方法一*/

void fen(char s[][10],char str)

{ int i,j,k;

for(i=0,j=0,k=0;str[i]!=0;i++)

if(isalpha(a[i]))

s[j][k++]=str[i];

else {

s[j][k]=0;

k=0;

j++;

}

}

}

/*方法二*/

#include

#include

void main()

{ int i=0,n=0;char s[80],*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("%d\n",n);

getch();

}

排序:

/*插入法排序*/

void sort(int a[],int n)

{ int i,j,t;

for(i=1;i

t=a[i];

for(j=i-1;j>=0&&t

a[j+1]=a[j];

a[j]=t;

}

}

/*归并排序*/

#define x 10

#define y 10

void com(int *a,int *b,int *c)

{ int i,j,k;

for(i=0,j=0,k=0;i<=x&&j<=y;){

if(a[i]

c[k++]=a[i];i++;}

else{

c[k++]=b[j];j++;}

}

if(i

c[k++]=a[i];

if(j

c[k++]=a[j]; }

/*交换法排序1 冒泡排序*/

void sort(int a[],int n)

{ int i,j,t,flag;

for(i=0;i

flag=1;

for(j=0;j

if(a[j]>a[j+1]){

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

flag=0;

}

if(flag) break;

}

}

/*交换法排序2*/

void sort(int a[],int n)

{ int i,j,t;

for(i=0;i

for(j=i+1;j

if(a[i]>a[j]){

t=a[i];

a[i]=a[j];

a[j]=t;

}

}

/*选择法排序*/

void sort(int a[],int n)

{ int i,j,point,t;

for(i=0;i

point=i;

for(j=i+1;j

if(a[point]

if(point!=i){

t=a[point];

a[point]=a[i];

a[i]=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 &&

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))<1e-6)

x=b;

else {

c=(b+a)/2;

while(fabs(f(c))>eps&&fabs(b-a)>eps){

if(f(a)*f(c)<0)

b=c;

else

a=c;

c=(b+a)/2;

}

x=c;

}

printf("x=%f",x);

}

/*弦截法求函数跟*/

c=(a*f(b)-b*f(a))/ (f(b)-f(a));

while(fabs(f(c))>eps){

if(f(a)*f(c)<0)

b=c;

else

a=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;x<5;x++) {

int x=2;

printf("%d",x);

}

printf("%d ",x);

f();

loop++;

}while(loop<1);

getch();

}

void f()

{ printf("%d",x++); }

8.汉诺塔:

#include

void Hanoi(int n, char A, char B, char C)

{

if(n==1)

printf("\n move %d from %c to %c",n,A,C);

else{

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(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);

}

相关主题